{
  "swagger": "2.0",
  "info": {
    "title": "Textual API",
    "description": "OpenAPI documentation for the Textual API",
    "version": "vDev"
  },
  "paths": {
    "/dcr": {
      "post": {
        "tags": [
          "A2ADcr"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/agent-connections": {
      "get": {
        "tags": [
          "Agent Connections"
        ],
        "summary": "List your agent connections",
        "produces": [
          "text/plain",
          "application/json",
          "text/json"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/AgentConnectionModel"
              }
            }
          }
        }
      }
    },
    "/api/v1/agent-connections/{connectionId}": {
      "delete": {
        "tags": [
          "Agent Connections"
        ],
        "summary": "Disconnect one of your agent connections",
        "produces": [
          "text/plain",
          "application/json",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "connectionId",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "202": {
            "description": "Accepted"
          },
          "404": {
            "description": "Not Found",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          }
        }
      }
    },
    "/api/v1/agent-connections/admin/users/{userId}": {
      "get": {
        "tags": [
          "Agent Connections"
        ],
        "summary": "List a user's agent connections (org admin)",
        "description": "\n### Required Permissions\n\n- **Global:** Manage Users And Groups, View All Datasets\n",
        "produces": [
          "text/plain",
          "application/json",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "userId",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/AgentConnectionModel"
              }
            }
          }
        }
      }
    },
    "/api/v1/agent-connections/admin/{connectionId}/users/{userId}": {
      "delete": {
        "tags": [
          "Agent Connections"
        ],
        "summary": "Disconnect a user's agent connection (org admin)",
        "description": "\n### Required Permissions\n\n- **Global:** Manage Users And Groups, View All Datasets\n",
        "produces": [
          "text/plain",
          "application/json",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "connectionId",
            "required": true,
            "type": "string"
          },
          {
            "in": "path",
            "name": "userId",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "202": {
            "description": "Accepted"
          },
          "404": {
            "description": "Not Found",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          }
        }
      }
    },
    "/api/Audio/transcribe/start": {
      "post": {
        "tags": [
          "Audio"
        ],
        "summary": "Start audio transcription",
        "description": "Starts a job to transcribe an audio file. The audio file must be in one of the following supported formats: m4a, mp3, webm, mp4, mpga, wav.  After the transcription job is complete, the original audio file is deleted. To use the returned job ID to fetch the transcription results, use `/api/audio/{jobId}/transcribe/result`. If you do not retrieve the results within 5 minutes after the transcription is complete, the results are automatically purged.",
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "responses": {
          "200": {
            "description": "Returns the transcription job ID",
            "schema": {
              "$ref": "#/definitions/UnattachedFileMinimalApiModel"
            }
          },
          "400": {
            "description": "Invalid input or unsupported audio file format",
            "schema": {
              "type": "string"
            }
          }
        }
      }
    },
    "/api/Audio/{jobId}/transcribe/result": {
      "get": {
        "tags": [
          "Audio"
        ],
        "summary": "Get transcription result",
        "description": "Retrieves the result of an audio transcription that was initiated from `/api/audio/transcribe/start`. The transcription is in JSON and contains timestamps for both words and segments.  After you retrieve the transcription result, the transcription record is deleted.",
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "jobId",
            "description": "The ID of the transcription job",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the transcription result",
            "schema": {
              "$ref": "#/definitions/TranscriptionResult"
            }
          },
          "404": {
            "description": "Transcription job not found",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          },
          "409": {
            "description": "File is still processing",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          },
          "410": {
            "description": "Transcription result has expired and been purged",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          }
        }
      }
    },
    "/api/audit-events/search": {
      "get": {
        "tags": [
          "Audit Events"
        ],
        "summary": "Search audit events",
        "description": "By default, the most recent 100 results will be returned.\n            \n**Adding filters to the request**\n            \nFor each filter to add, use the following format:\n            \n    parameterName=value\n            \nUse & to separate multiple filter values:\n            \n    parameter1Name=parameter1Value&parameter2Name=parameter2Value\n            \n**Valid filter parameters**\n            \nYou can filter the included events based on the following parameters:\n            \n<i>event_category</i> - The general category of event.\nFor example, to filter the results to only include events related to permission sets:\n            \n    event_category=PermissionSet\n            \nYou can provide multiple event category values.\nFor example, to filter the results to include events related to both assigned permissions and permission sets:\n            \n    event_category=PermissionSet&event_category=AssignedPermissions\n            \n<i>event_type</i> - The specific type of event.\nTo get the available event types, refer to Solar.Core.Enums.AuditEvents.AuditEventType.\nFor example, to filter the results to only include when a permission set was created:\n            \n    event_type=PermissionSetCreated\n            \nYou can provide multiple event type values.\nFor example, to filter the results to include both when a permission set was created and when a permission set was updated:\n            \n    event_type=PermissionSetCreated&event_type=PermissionSetUpdated\n            \n<i>outcome</i> - Whether the event was successful (<i>Success</i>) or failed (<i>Fail</i>).\nFor example, to filter the results to only include successful events:\n            \n    outcome=Success\n            \n<i>created_before</i> - Used to only include events that occurred before the specified timestamp.\n            \nThe timestamp uses the ISO 8601 format (<i>yyyy-MM-dd'T'HH:mm:ssZ</i>).\nFor example, to filter the results to only include events that occurred before 6:30 PM UTC on August 1, 2023:\n            \n    created_before=2023-08-01T18:30:00Z\n            \n<i>created_after</i> - Used to only include events that occurred after the specified timestamp.\n            \nThe timestamp uses the ISO 8601 format (<i>yyyy-MM-dd'T'HH:mm:ssZ</i>).\nFor example, to filter the results to only include events that occurred after 10:00 AM UTC on July 27, 2023:\n            \n    created_after=2023-07-27T10:00:00Z\n            \n<i>include_unidentified_events</i> - For self-hosted instances, whether to include events that do not have an identified user.\nBy default, is false. These events might be server-generated or might be related to an unauthenticated action.\nTo include events that do not have an identified user:\n            \n    include_unidentified_events=true\n            \n**Sample requests:**\n            \nFirst 100 results by most recent:\n            \n    GET /api/audit-events/search\n            \nReturns the first 20 results for permission set events that were successful:\n            \n    GET /api/audit-events/search?limit=20&event_category=PermissionSet&outcome=Success\n### Required Permissions\n\n- **Global:** Manage Users And Groups, View All Datasets\n",
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "query",
            "name": "offset",
            "description": "Number of records to skip for pagination",
            "type": "integer",
            "format": "int32"
          },
          {
            "in": "query",
            "name": "limit",
            "description": "Maximum number of records to return",
            "type": "integer",
            "format": "int32"
          },
          {
            "in": "query",
            "name": "event_category",
            "description": "Filter by event category",
            "type": "array",
            "items": {
              "$ref": "#/definitions/AuditEventCategory"
            },
            "collectionFormat": "multi"
          },
          {
            "in": "query",
            "name": "event_type",
            "description": "Filter by specific event type",
            "type": "array",
            "items": {
              "$ref": "#/definitions/AuditEventType"
            },
            "collectionFormat": "multi"
          },
          {
            "in": "query",
            "name": "outcome",
            "description": "Filter by event outcome (Success or Fail)"
          },
          {
            "in": "query",
            "name": "created_before",
            "description": "Only include events before this timestamp (ISO 8601)",
            "type": "string",
            "format": "date-time"
          },
          {
            "in": "query",
            "name": "created_after",
            "description": "Only include events after this timestamp (ISO 8601)",
            "type": "string",
            "format": "date-time"
          },
          {
            "in": "query",
            "name": "include_unidentified_events",
            "description": "Include events without an identified user (self-hosted only)",
            "type": "boolean"
          }
        ],
        "responses": {
          "200": {
            "description": "Returns paginated audit events",
            "schema": {
              "$ref": "#/definitions/AuditEventModelPaginationResponseModel"
            }
          },
          "400": {
            "description": "Invalid filter parameters or unsupported query option",
            "schema": {
              "type": "string"
            }
          }
        }
      }
    },
    "/api/dataset/{datasetId}/shares": {
      "get": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "List dataset shares",
        "description": "Returns all user and group permission assignments for the specified dataset.",
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "datasetId",
            "description": "The unique identifier of the dataset",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "Returns dataset permission assignments",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/ResourcePermissionSetAssignmentModel"
              }
            }
          },
          "404": {
            "description": "Dataset not found",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          }
        }
      }
    },
    "/api/dataset/{datasetId}/shares/bulk": {
      "post": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Modify dataset shares",
        "description": "Adds or removes user and group permission assignments for the specified dataset in bulk.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "datasetId",
            "description": "The ID of the dataset",
            "required": true,
            "type": "string"
          },
          {
            "in": "body",
            "name": "body",
            "description": "Request that contains the users or groups to grant permissions to or revoke permissions from on the dataset.",
            "schema": {
              "description": "A request to modify the permission assignments for a dataset.",
              "allOf": [
                {
                  "$ref": "#/definitions/ModifyResourcePermissionSetAssignmentsRequestModel"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns modified permission assignments",
            "schema": {
              "$ref": "#/definitions/ModifyResourcePermissionSetAssignmentsModel"
            }
          },
          "400": {
            "description": "Invalid request body or model validation failed",
            "schema": {
              "type": "string"
            }
          },
          "404": {
            "description": "Dataset not found",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          }
        }
      }
    },
    "/api/Dataset": {
      "get": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Get all datasets",
        "description": "Returns all of the datasets that the user has access to.  Each dataset contains a set of minimal info, for more detailed information on a given dataset use the /api/dataset/{datasetId} endpoint.",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "filterSynthesized",
            "description": "When true, excludes synthesized datasets from results",
            "required": true,
            "type": "boolean",
            "default": true
          }
        ],
        "responses": {
          "200": {
            "description": "Returns all accessible datasets",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/MinimalDatasetResponseModel"
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Create a dataset",
        "description": "Creates a new dataset with the specified configuration. You must specify a unique, non-empty dataset name.\n### Required Permissions\n\n- **Global:** Create Dataset\n",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "schema": {
              "description": "Request to create a new dataset for PII detection and redaction.",
              "allOf": [
                {
                  "$ref": "#/definitions/CreateDatasetRequest"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the newly created dataset",
            "schema": {
              "$ref": "#/definitions/DatasetResponseModel"
            }
          },
          "400": {
            "description": "The dataset name must be specified",
            "schema": {
              "type": "string"
            }
          },
          "409": {
            "description": "Dataset name is already in use",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          }
        }
      },
      "put": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Edit a dataset",
        "description": "Updates a dataset to use the specified configuration.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "query",
            "name": "shouldRescan",
            "description": "When true, triggers a rescan of dataset files after the update",
            "type": "boolean"
          },
          {
            "in": "body",
            "name": "body",
            "description": "",
            "schema": {
              "description": "Request to update an existing dataset's configuration, redaction policies, and entity settings.",
              "allOf": [
                {
                  "$ref": "#/definitions/EditDatasetRequest"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the updated dataset",
            "schema": {
              "$ref": "#/definitions/DatasetResponseModel"
            }
          },
          "404": {
            "description": "The dataset cannot be found",
            "schema": {
              "type": "string"
            }
          },
          "409": {
            "description": "Dataset name is already in use",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          }
        }
      }
    },
    "/api/Dataset/paginated": {
      "get": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Get all datasets (paginated)",
        "description": "Returns a paginated response of the datasets that the user has access to. Optionally filter by dataset name using the search parameter. Each dataset contains a set of minimal info, for more detailed information on a given dataset use the /api/dataset/{datasetId} endpoint.",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "query",
            "name": "sortBy",
            "description": "The field to sort by. Defaults to LastUpdated."
          },
          {
            "in": "query",
            "name": "sortDirection",
            "description": "The sort direction. Defaults to Desc (newest first for LastUpdated, Z-A for Name)."
          },
          {
            "in": "query",
            "name": "offset",
            "description": "Gets the offset for pagination.",
            "type": "integer",
            "format": "int32"
          },
          {
            "in": "query",
            "name": "limit",
            "description": "Gets the limit for pagination.",
            "type": "integer",
            "format": "int32"
          },
          {
            "in": "query",
            "name": "filterSynthesized",
            "description": "When true, excludes synthesized datasets from results",
            "type": "boolean",
            "default": true
          },
          {
            "in": "query",
            "name": "search",
            "description": "Filter datasets by name",
            "type": "string"
          },
          {
            "in": "query",
            "name": "tags",
            "description": "Filter datasets that match any of the specified tags",
            "type": "array",
            "items": {
              "type": "string"
            },
            "collectionFormat": "multi"
          },
          {
            "in": "query",
            "name": "createdBy",
            "description": "Filter datasets by creator user IDs",
            "type": "array",
            "items": {
              "type": "string"
            },
            "collectionFormat": "multi"
          },
          {
            "in": "query",
            "name": "fileSources",
            "description": "Filter datasets by source type",
            "type": "array",
            "items": {
              "$ref": "#/definitions/FileSource"
            },
            "collectionFormat": "multi"
          },
          {
            "in": "query",
            "name": "fileTypes",
            "description": "Filter datasets by file type",
            "type": "array",
            "items": {
              "$ref": "#/definitions/FileTypeEnum"
            },
            "collectionFormat": "multi"
          },
          {
            "in": "query",
            "name": "requireOperation",
            "description": "When specified, only returns datasets where the user has this operation"
          }
        ],
        "responses": {
          "200": {
            "description": "Returns paginated list of datasets",
            "schema": {
              "$ref": "#/definitions/MinimalDatasetResponseModelPaginationResponseModel"
            }
          }
        }
      }
    },
    "/api/Dataset/search": {
      "get": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Search datasets",
        "description": "Search datasets with filtering and pagination options.",
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "query",
            "name": "filters",
            "description": "Dictionary of field name to field value for filtering datasets",
            "type": "string"
          },
          {
            "in": "query",
            "name": "offset",
            "description": "Gets the offset for pagination.",
            "type": "integer",
            "format": "int32"
          },
          {
            "in": "query",
            "name": "limit",
            "description": "Gets the limit for pagination.",
            "type": "integer",
            "format": "int32"
          }
        ],
        "responses": {
          "200": {
            "description": "Returns matching datasets",
            "schema": {
              "$ref": "#/definitions/MinimalDatasetResponseModelPaginationResponseModel"
            }
          },
          "400": {
            "description": "Invalid or unsupported search filter",
            "schema": {
              "type": "string"
            }
          }
        },
        "deprecated": true
      }
    },
    "/api/Dataset/{datasetId}": {
      "get": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Get a dataset",
        "description": "Returns the dataset specified by the dataset identifier (datasetId).",
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "datasetId",
            "description": "The unique identifier of the dataset",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the dataset details",
            "schema": {
              "$ref": "#/definitions/DatasetResponseModel"
            }
          },
          "404": {
            "description": "The dataset cannot be found",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          }
        }
      }
    },
    "/api/Dataset/{datasetId}/import": {
      "post": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Import dataset settings",
        "description": "Imports the dataset settings from one dataset into this one. The settings on this dataset will be overridden",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "datasetId",
            "required": true,
            "type": "string"
          },
          {
            "in": "body",
            "name": "body",
            "schema": {
              "allOf": [
                {
                  "$ref": "#/definitions/ImportDatasetSettingsOptions"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the updated dataset",
            "schema": {
              "$ref": "#/definitions/DatasetResponseModel"
            }
          },
          "404": {
            "description": "Dataset not found",
            "schema": {
              "type": "string"
            }
          },
          "400": {
            "description": "Cannot import settings from the same dataset",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          }
        }
      }
    },
    "/api/Dataset/{datasetId}/rescan": {
      "post": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Trigger a bulk rescan of all files needing rescan in the dataset.",
        "produces": [
          "text/plain",
          "application/json",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "datasetId",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "404": {
            "description": "Not Found",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          }
        }
      }
    },
    "/api/Dataset/{datasetId}/files/{fileId}/download": {
      "get": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Download a dataset file",
        "description": "Downloads the specified file from the dataset. The downloaded file is redacted based on the dataset configuration.",
        "produces": [
          "application/octet-stream",
          "text/plain",
          "application/json",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "datasetId",
            "description": "The unique identifier of the dataset",
            "required": true,
            "type": "string"
          },
          {
            "in": "path",
            "name": "fileId",
            "description": "The unique identifier of the file",
            "required": true,
            "type": "string"
          },
          {
            "in": "query",
            "name": "jsonDownloadAs",
            "description": "Format for JSON file downloads",
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the redacted file stream",
            "schema": {
              "type": "string",
              "format": "binary"
            }
          },
          "400": {
            "description": "Invalid request parameters or unsupported file type for the requested operation",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          },
          "404": {
            "description": "Dataset or file not found",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          },
          "409": {
            "description": "File is still processing",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          },
          "429": {
            "description": "Redaction capacity is temporarily exhausted",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          },
          "502": {
            "description": "Redaction service returned an invalid response"
          },
          "503": {
            "description": "Redaction service is temporarily unavailable"
          },
          "504": {
            "description": "Redaction service timed out"
          },
          "500": {
            "description": "An unexpected error occurred during redaction processing"
          }
        }
      }
    },
    "/api/Dataset/{datasetId}/files/{fileId}/{jsonDownloadAs}/download_json_content_as": {
      "get": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Download parsed file as Markdown or HTML",
        "description": "Downloads a parsed file as either Markdown or HTML.  The entity configuration on the dataset determines what is redacted/synthesized/ignored in the output.  HTML is only supported for RTF files.",
        "produces": [
          "application/octet-stream",
          "text/plain",
          "application/json",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "datasetId",
            "description": "The unique identifier of the dataset",
            "required": true,
            "type": "string"
          },
          {
            "in": "path",
            "name": "fileId",
            "description": "The unique identifier of the file",
            "required": true,
            "type": "string"
          },
          {
            "in": "path",
            "name": "jsonDownloadAs",
            "description": "The output format (Markdown or Html)",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "Returns file as Markdown or HTML",
            "schema": {
              "type": "string",
              "format": "binary"
            }
          },
          "400": {
            "description": "Invalid download option or unsupported file type for the requested format",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          },
          "404": {
            "description": "Dataset or file not found",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          },
          "409": {
            "description": "File is still processing",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          },
          "500": {
            "description": "An unexpected error occurred during processing"
          }
        }
      }
    },
    "/api/Dataset/{datasetId}/files/download_all": {
      "get": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Download all dataset files",
        "description": "Downloads all files from the specified dataset. The downloaded files are redacted based on the dataset configuration.",
        "produces": [
          "application/octet-stream",
          "text/plain",
          "application/json",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "datasetId",
            "description": "The unique identifier of the dataset",
            "required": true,
            "type": "string"
          },
          {
            "in": "query",
            "name": "jsonDownloadAs",
            "description": "Format for JSON file downloads",
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "Returns ZIP archive of all redacted files",
            "schema": {
              "type": "string",
              "format": "binary"
            }
          },
          "400": {
            "description": "Invalid request parameters or download option",
            "schema": {
              "type": "string"
            }
          },
          "404": {
            "description": "Dataset not found",
            "schema": {
              "type": "string"
            }
          },
          "500": {
            "description": "An unexpected error occurred during processing"
          }
        }
      }
    },
    "/api/Dataset/{datasetId}/files/download_selected": {
      "post": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Download selected dataset files",
        "description": "Downloads the specified files from the dataset as a single ZIP archive. The downloaded files are redacted based on the dataset configuration.",
        "consumes": [
          "application/json",
          "text/json",
          "application/*+json"
        ],
        "produces": [
          "application/octet-stream",
          "text/plain",
          "application/json",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "datasetId",
            "description": "The unique identifier of the dataset",
            "required": true,
            "type": "string"
          },
          {
            "in": "body",
            "name": "body",
            "description": "The files to include in the archive and the format for JSON file downloads",
            "schema": {
              "description": "Request model for downloading a user-selected subset of a dataset's files as a single ZIP archive.\nSent as a POST body rather than a query string because a selection can hold hundreds of file ids,\nwhich would exceed URL length limits.",
              "allOf": [
                {
                  "$ref": "#/definitions/DownloadSelectedFilesRequest"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns ZIP archive of the selected redacted files",
            "schema": {
              "type": "string",
              "format": "binary"
            }
          },
          "400": {
            "description": "Invalid request parameters or download option",
            "schema": {
              "type": "string"
            }
          },
          "404": {
            "description": "Dataset not found, or none of the selected files belong to the dataset",
            "schema": {
              "type": "string"
            }
          },
          "500": {
            "description": "An unexpected error occurred during processing"
          }
        }
      }
    },
    "/api/Dataset/{datasetId}/files/upload": {
      "post": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Upload dataset files",
        "description": "Upload a file to a dataset for processing.",
        "consumes": [
          "multipart/form-data"
        ],
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "datasetId",
            "description": "The unique identifier of the dataset",
            "required": true,
            "type": "string"
          },
          {
            "in": "formData",
            "name": "document",
            "type": "string"
          },
          {
            "in": "formData",
            "name": "file",
            "description": "File to upload",
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "Returns uploaded file details",
            "schema": {
              "$ref": "#/definitions/UploadedFileResponseModel"
            }
          },
          "400": {
            "description": "Invalid input, unsupported file type, or upload failed",
            "schema": {
              "type": "string"
            }
          },
          "409": {
            "description": "Duplicate file already uploaded",
            "schema": {
              "type": "string"
            }
          }
        }
      }
    },
    "/api/Dataset/{datasetId}/files/delete_selected": {
      "post": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Delete selected dataset files",
        "description": "Deletes the specified files from the dataset. Ids that do not belong to the dataset are ignored.",
        "consumes": [
          "application/json",
          "text/json",
          "application/*+json"
        ],
        "produces": [
          "text/plain",
          "application/json",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "datasetId",
            "required": true,
            "type": "string"
          },
          {
            "in": "body",
            "name": "body",
            "schema": {
              "description": "Request model for deleting a user-selected subset of a dataset's files. Sent as a POST body rather than\na query string because a selection can hold hundreds of file ids, which would exceed URL length limits.",
              "allOf": [
                {
                  "$ref": "#/definitions/DeleteSelectedFilesRequest"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the deleted files",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/FileResponseModel"
              }
            }
          },
          "400": {
            "description": "Invalid request",
            "schema": {
              "type": "string"
            }
          },
          "404": {
            "description": "Dataset or selected files not found",
            "schema": {
              "type": "string"
            }
          }
        }
      }
    },
    "/api/Dataset/{datasetId}/history": {
      "get": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Get the version history for a dataset.",
        "description": "Returns the version history for a dataset, ordered by version number descending. Supports pagination and search.",
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "datasetId",
            "description": "The unique identifier of the dataset",
            "required": true,
            "type": "string"
          },
          {
            "in": "query",
            "name": "offset",
            "description": "Gets the offset for pagination.",
            "type": "integer",
            "format": "int32"
          },
          {
            "in": "query",
            "name": "limit",
            "description": "Gets the limit for pagination.",
            "type": "integer",
            "format": "int32"
          },
          {
            "in": "query",
            "name": "search",
            "description": "Optional search text to filter versions by change description",
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/DatasetVersionResponseModelPaginationResponseModel"
            }
          },
          "404": {
            "description": "The dataset cannot be found",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          }
        }
      }
    },
    "/api/Dataset/{datasetId}/history/{versionNumber}": {
      "get": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Get a specific version of a dataset.",
        "description": "Returns a specific version of a dataset by version number.",
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "datasetId",
            "description": "The unique identifier of the dataset",
            "required": true,
            "type": "string"
          },
          {
            "in": "path",
            "name": "versionNumber",
            "description": "The version number to retrieve",
            "required": true,
            "type": "integer",
            "format": "int32"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/DatasetVersionResponseModel"
            }
          },
          "404": {
            "description": "The dataset or version cannot be found",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          }
        }
      }
    },
    "/api/Dataset/{datasetId}/history/restore/{versionNumber}": {
      "post": {
        "tags": [
          "Dataset Management"
        ],
        "summary": "Restore a dataset to a specific version.",
        "description": "Restores a dataset's settings to a specific version. Creates a new version with the restored state.",
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "datasetId",
            "description": "The unique identifier of the dataset",
            "required": true,
            "type": "string"
          },
          {
            "in": "path",
            "name": "versionNumber",
            "description": "The version number to restore to",
            "required": true,
            "type": "integer",
            "format": "int32"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/DatasetResponseModel"
            }
          },
          "404": {
            "description": "The dataset or version cannot be found",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          }
        }
      }
    },
    "/api/redact/pii_types": {
      "get": {
        "tags": [
          "Entity Types"
        ],
        "summary": "List entity types",
        "description": "Returns the full list of built-in entity types that the redaction engine can detect and transform.",
        "produces": [
          "application/json"
        ],
        "responses": {
          "200": {
            "description": "Returns all supported entity types",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/PiiTypeEnum"
              }
            }
          }
        }
      }
    },
    "/api/unattachedfile/{jobId}/download": {
      "post": {
        "tags": [
          "File Redaction"
        ],
        "summary": "Download a redacted file",
        "description": "Downloads the redacted version of a previously uploaded file. The file must have completed processing before it can be downloaded. Redaction options provided in the request body control how entities are transformed in the output.",
        "consumes": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "jobId",
            "description": "The ID of the file processing job",
            "required": true,
            "type": "string"
          },
          {
            "in": "body",
            "name": "body",
            "description": "",
            "schema": {
              "description": "Base redaction request containing shared options for entity detection, synthesis configuration, and document processing policies.",
              "allOf": [
                {
                  "$ref": "#/definitions/BaseApiRedactionRequest"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the redacted file content"
          },
          "404": {
            "description": "File or job not found"
          },
          "409": {
            "description": "File is still processing"
          }
        }
      }
    },
    "/api/unattachedfile/upload": {
      "post": {
        "tags": [
          "File Redaction"
        ],
        "summary": "Upload a file for redaction",
        "description": "Uploads a file and begins processing it for PII detection and redaction. Returns a job identifier that can be used to check processing status and download the redacted file once complete.",
        "consumes": [
          "multipart/form-data"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "formData",
            "name": "document",
            "type": "string"
          },
          {
            "in": "formData",
            "name": "file",
            "description": "File to upload",
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the upload job identifier",
            "schema": {
              "$ref": "#/definitions/UnattachedFileMinimalApiModel"
            }
          },
          "400": {
            "description": "Invalid input or file upload failed"
          }
        }
      }
    },
    "/api/unattachedfile": {
      "get": {
        "tags": [
          "File Redaction"
        ],
        "summary": "Gets all unattached file jobs for the current user within a time window.",
        "description": "Returns all unattached file jobs for the current user within the specified time window. The time window defaults to 1 hour if not provided. Jobs are returned in descending order by creation date.",
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "query",
            "name": "from",
            "description": "How far back to look for jobs, as a timespan string (e.g. \"01:00:00\" for 1 hour). Defaults to 1 hour if not provided.",
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "The list of unattached file jobs",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/JobModel"
              }
            }
          },
          "400": {
            "description": "Invalid timespan format",
            "schema": {
              "type": "string"
            }
          }
        }
      }
    },
    "/api/unattachedfile/{jobId}": {
      "get": {
        "tags": [
          "File Redaction"
        ],
        "summary": "Gets a specific unattached file job by ID for the current user.",
        "description": "Returns the details of a specific unattached file job by ID. The job must have been created within the specified time window, which defaults to 1 hour if not provided.",
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "jobId",
            "description": "The ID of the file processing job",
            "required": true,
            "type": "string"
          },
          {
            "in": "query",
            "name": "from",
            "description": "How far back to look for the job, as a timespan string (e.g. \"01:00:00\" for 1 hour). Defaults to 1 hour if not provided.",
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "The unattached file job details",
            "schema": {
              "$ref": "#/definitions/JobModel"
            }
          },
          "400": {
            "description": "Invalid timespan format",
            "schema": {
              "type": "string"
            }
          },
          "404": {
            "description": "Job not found within the specified time window"
          }
        }
      },
      "delete": {
        "tags": [
          "File Redaction"
        ],
        "summary": "Hard delete an unattached file",
        "description": "Permanently deletes a previously uploaded file and everything derived from it: the stored file, the processing job, detected entities, OCR and page data, and embedded images. The job must have finished processing. This cannot be undone.",
        "produces": [
          "text/plain",
          "application/json",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "jobId",
            "description": "The ID of the file processing job",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "204": {
            "description": "The file and its related data were deleted"
          },
          "404": {
            "description": "Job not found"
          },
          "409": {
            "description": "File is still processing",
            "schema": {
              "type": "string"
            }
          }
        }
      }
    },
    "/api/Groups": {
      "get": {
        "tags": [
          "Groups"
        ],
        "summary": "List groups",
        "description": "Returns all groups in your organization. Returns an empty list in hosted environments.\n### Required Permissions\n\n- **Global:** View Users And Groups\n",
        "produces": [
          "application/json"
        ],
        "responses": {
          "200": {
            "description": "Returns the list of groups",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/GroupEntityModel"
              }
            }
          }
        }
      }
    },
    "/api/manualredaction/{manualRedactionProjectId}/shares": {
      "get": {
        "tags": [
          "Guided Redaction Management"
        ],
        "summary": "List project shares",
        "description": "Returns all user and group permission assignments for the specified manual redaction project.",
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "manualRedactionProjectId",
            "description": "The unique identifier of the project",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "Returns project permission assignments",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/ResourcePermissionSetAssignmentModel"
              }
            }
          },
          "404": {
            "description": "Project not found",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          }
        }
      }
    },
    "/api/manualredaction/{manualRedactionProjectId}/shares/bulk": {
      "post": {
        "tags": [
          "Guided Redaction Management"
        ],
        "summary": "Modify project shares",
        "description": "Adds or removes user and group permission assignments for the specified manual redaction project in bulk.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "manualRedactionProjectId",
            "description": "The ID of the manual redaction project",
            "required": true,
            "type": "string"
          },
          {
            "in": "body",
            "name": "body",
            "description": "Request that contains the users or groups to grant permissions to or revoke permissions from on the manual redaction project.",
            "schema": {
              "description": "A request to modify the permission assignments for a dataset.",
              "allOf": [
                {
                  "$ref": "#/definitions/ModifyResourcePermissionSetAssignmentsRequestModel"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns modified permission assignments",
            "schema": {
              "$ref": "#/definitions/ModifyResourcePermissionSetAssignmentsModel"
            }
          },
          "400": {
            "description": "Invalid request body or model validation failed",
            "schema": {
              "type": "string"
            }
          },
          "404": {
            "description": "Project not found",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          }
        }
      }
    },
    "/api/ManualRedaction/{manualRedactionProjectId}": {
      "get": {
        "tags": [
          "Guided Redaction Management"
        ],
        "summary": "Get a project",
        "description": "Returns the manual redaction project specified by the project identifier (manualRedactionProjectId).",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "manualRedactionProjectId",
            "description": "The unique identifier of the project",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the project details",
            "schema": {
              "$ref": "#/definitions/ManualRedactionProjectResponseModel"
            }
          },
          "404": {
            "description": "The manual redaction project cannot be found"
          }
        }
      }
    },
    "/api/ManualRedaction": {
      "post": {
        "tags": [
          "Guided Redaction Management"
        ],
        "summary": "Create a project",
        "description": "Creates a new manual redaction project with the specified configuration. You must specify a unique, non-empty project name.\n### Required Permissions\n\n- **Global:** Create Manual Redaction Project\n",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "schema": {
              "description": "Request to create a new guided redaction project.",
              "allOf": [
                {
                  "$ref": "#/definitions/CreateManualReactionProjectRequest"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the created project",
            "schema": {
              "$ref": "#/definitions/ManualRedactionProjectResponseModel"
            }
          },
          "400": {
            "description": "The project name must be specified",
            "schema": {
              "type": "string"
            }
          },
          "409": {
            "description": "Project name is already in use",
            "schema": {
              "type": "string"
            }
          }
        }
      }
    },
    "/api/ManualRedaction/{manualRedactionProjectId}/files/{manualRedactionFileId}/download": {
      "post": {
        "tags": [
          "Guided Redaction Management"
        ],
        "summary": "Download a file",
        "description": "Downloads the specified file from the manual redaction project. The downloaded file is redacted based on the provided output options. If no options provided, system defaults are used.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "image/jpeg"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "manualRedactionProjectId",
            "description": "The unique identifier of the project",
            "required": true,
            "type": "string"
          },
          {
            "in": "path",
            "name": "manualRedactionFileId",
            "description": "The unique identifier of the file within the project",
            "required": true,
            "type": "string"
          },
          {
            "in": "body",
            "name": "body",
            "description": "",
            "schema": {
              "description": "Output options for the generated PDF generated via a guided redaction, controlling reference codes, watermarks, and page numbers.",
              "allOf": [
                {
                  "$ref": "#/definitions/ManualRedactionOutputOptions"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the redacted image",
            "schema": {
              "type": "string",
              "format": "binary"
            }
          },
          "400": {
            "description": "Invalid input or malformed content"
          },
          "404": {
            "description": "Project or file not found"
          },
          "409": {
            "description": "File is still processing"
          },
          "500": {
            "description": "An unexpected error occurred during redaction processing"
          }
        }
      }
    },
    "/api/ManualRedaction/{manualRedactionProjectId}/files/download_all": {
      "post": {
        "tags": [
          "Guided Redaction Management"
        ],
        "summary": "Download all files",
        "description": "Downloads all files from the specified manual redaction project. The downloaded files are redacted based on the provided output options. If no options provided, system defaults are used.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/octet-stream",
          "text/plain",
          "application/json",
          "text/json"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "manualRedactionProjectId",
            "description": "The unique identifier of the project",
            "required": true,
            "type": "string"
          },
          {
            "in": "body",
            "name": "body",
            "description": "",
            "schema": {
              "description": "Output options for the generated PDF generated via a guided redaction, controlling reference codes, watermarks, and page numbers.",
              "allOf": [
                {
                  "$ref": "#/definitions/ManualRedactionOutputOptions"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns ZIP of all redacted files",
            "schema": {
              "type": "string",
              "format": "binary"
            }
          },
          "400": {
            "description": "Invalid input or malformed content",
            "schema": {
              "type": "string"
            }
          },
          "404": {
            "description": "Project not found",
            "schema": {
              "type": "string"
            }
          },
          "500": {
            "description": "An unexpected error occurred during processing"
          }
        }
      }
    },
    "/api/JobLogs/{jobId}/error/download": {
      "get": {
        "tags": [
          "Job Logs"
        ],
        "summary": "Downloads the error logs for a specific job as a text file.",
        "description": "Downloads the error logs for a job that has failed or encountered errors. Returns a text file containing the log output. This endpoint is not available in hosted production environments.",
        "produces": [
          "text/plain"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "jobId",
            "description": "The job identifier",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "The job error logs as a text file",
            "schema": {
              "type": "string",
              "format": "binary"
            }
          },
          "400": {
            "description": "Invalid request",
            "schema": {
              "type": "string"
            }
          },
          "403": {
            "description": "User does not have permission to access this job's logs, or endpoint is disabled in hosted production",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          },
          "404": {
            "description": "Job not found, or job completed successfully and has no error logs",
            "schema": {
              "type": "string"
            }
          }
        }
      }
    },
    "/api/permission-sets": {
      "get": {
        "tags": [
          "Permission Sets"
        ],
        "summary": "List permission sets",
        "description": "Users that have the global permission Manage Permission Sets get the full details, including the available operations.\n### Required Permissions\n\n- **Global (At least 1 of the following):** Manage Permission Sets, Manage User Global Permissions\n",
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "query",
            "name": "type",
            "description": "Optional filter for the types of permission sets to retrieve",
            "type": "array",
            "items": {
              "$ref": "#/definitions/PermissionSetType"
            },
            "collectionFormat": "multi"
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the list of permission sets",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/PermissionSetModel"
              }
            }
          },
          "400": {
            "description": "Invalid filter parameters",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/api/request-auditor/settings": {
      "get": {
        "tags": [
          "RequestAuditorSettings"
        ],
        "summary": "Returns the Request Auditor settings for the current organization.\nReturns defaults if no settings have been saved.",
        "description": "\n### Required Permissions\n\n- **Global (At least 1 of the following):** Use Request Auditor, Manage Request Auditor Settings\n",
        "produces": [
          "text/plain",
          "application/json",
          "text/json"
        ],
        "responses": {
          "200": {
            "description": "Settings retrieved successfully",
            "schema": {
              "$ref": "#/definitions/RequestAuditorSettingsModel"
            }
          },
          "403": {
            "description": "Insufficient permissions. Requires either UseRequestAuditor or ManageRequestAuditorSettings,\nsince the settings (e.g. the review score threshold) are needed to display the request log."
          }
        }
      },
      "put": {
        "tags": [
          "RequestAuditorSettings"
        ],
        "summary": "Creates or updates the Request Auditor settings for the current organization.",
        "description": "\n### Required Permissions\n\n- **Global:** Manage Request Auditor Settings\n",
        "consumes": [
          "application/json",
          "text/json",
          "application/*+json"
        ],
        "produces": [
          "text/plain",
          "application/json",
          "text/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "description": "The settings to save",
            "schema": {
              "allOf": [
                {
                  "$ref": "#/definitions/RequestAuditorSettingsRequestModel"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Settings saved successfully",
            "schema": {
              "$ref": "#/definitions/RequestAuditorSettingsModel"
            }
          },
          "400": {
            "description": "Invalid request"
          },
          "403": {
            "description": "Insufficient permissions"
          }
        }
      }
    },
    "/api/Synthesis/group": {
      "post": {
        "tags": [
          "Synthesis"
        ],
        "summary": "Group entities",
        "description": "Group entities together based on the original text",
        "consumes": [
          "application/json",
          "text/json",
          "application/*+json"
        ],
        "produces": [
          "text/plain",
          "application/json",
          "text/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "schema": {
              "description": "Request to group detected entities using entity linking.",
              "allOf": [
                {
                  "$ref": "#/definitions/GroupRequest"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns grouped entities",
            "schema": {
              "$ref": "#/definitions/GroupResponse"
            }
          }
        }
      }
    },
    "/api/Synthesis/group_synthesis": {
      "post": {
        "tags": [
          "Synthesis"
        ],
        "summary": "Group similar entities and synthesize replacements",
        "description": "Group entities together based on the original text and generate synthetic replacements, returning redacted text with all entities in the same group receiving the same replacement value",
        "consumes": [
          "application/json",
          "text/json",
          "application/*+json"
        ],
        "produces": [
          "text/plain",
          "application/json",
          "text/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "schema": {
              "allOf": [
                {
                  "$ref": "#/definitions/GroupSynthesisRequest"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns grouped entities with replacements",
            "schema": {
              "$ref": "#/definitions/GroupSynthesisResponse"
            }
          }
        }
      }
    },
    "/api/Redact/structured_table": {
      "post": {
        "tags": [
          "Text Redaction"
        ],
        "summary": "Redact structured table",
        "description": "Returns a modified version of the structured table, redacted according to each column's provided entity type.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "schema": {
              "allOf": [
                {
                  "$ref": "#/definitions/StructuredTableRedactionRequest"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the redacted table data",
            "schema": {
              "$ref": "#/definitions/RedactionSdkModel"
            }
          },
          "400": {
            "description": "Invalid entity types or column count",
            "schema": {
              "type": "string"
            }
          }
        }
      }
    },
    "/api/Redact/json": {
      "post": {
        "tags": [
          "Text Redaction"
        ],
        "summary": "JSON",
        "description": "Returns a modified version of the JSON that redacts or synthesizes the detected entity values. The redacted JSON has the same structure as the input JSON. Only the primitive JSON values, such as strings and numbers, are modified. Optionally, provide an array of JSONPath expressions in `jsonPathIgnorePaths` to exclude specific values from redaction.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "schema": {
              "description": "Request to redact PII from a JSON document.",
              "allOf": [
                {
                  "$ref": "#/definitions/JsonRedactionRequest"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the redacted JSON",
            "schema": {
              "$ref": "#/definitions/RedactionSdkModel"
            }
          },
          "400": {
            "description": "Invalid JSON input",
            "schema": {
              "type": "string"
            }
          }
        }
      }
    },
    "/api/Redact": {
      "post": {
        "tags": [
          "Text Redaction"
        ],
        "summary": "Plain text",
        "description": "Returns a modified version of the provided text string that redacts or synthesizes the detected entity values.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "schema": {
              "description": "Request to redact PII from plain text.",
              "allOf": [
                {
                  "$ref": "#/definitions/RedactionRequest"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the redacted text",
            "schema": {
              "$ref": "#/definitions/RedactionSdkModel"
            }
          },
          "400": {
            "description": "Invalid request parameters",
            "schema": {
              "type": "string"
            }
          }
        }
      }
    },
    "/api/Redact/bulk": {
      "post": {
        "tags": [
          "Text Redaction"
        ],
        "summary": "Bulk plain text",
        "description": "Returns a modified version of the provided text strings that redacts or synthesizes the detected entity values. Processes multiple text strings in parallel.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "schema": {
              "description": "Request model for bulk plain text redaction.",
              "allOf": [
                {
                  "$ref": "#/definitions/BulkApiRedactionRequest"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the bulk redacted text",
            "schema": {
              "$ref": "#/definitions/BulkRedactionSdkModel"
            }
          }
        }
      }
    },
    "/api/Redact/xml": {
      "post": {
        "tags": [
          "Text Redaction"
        ],
        "summary": "XML",
        "description": "Returns a modified version of the XML that redacts or synthesizes the detected entity values. The redacted XML has the same structure as the input XML. Only the XML inner text and attribute values are modified.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "schema": {
              "description": "Request to redact PII from an XML document.",
              "allOf": [
                {
                  "$ref": "#/definitions/XmlRedactionRequest"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the redacted XML",
            "schema": {
              "$ref": "#/definitions/RedactionSdkModel"
            }
          },
          "400": {
            "description": "Invalid XML input",
            "schema": {
              "type": "string"
            }
          }
        }
      }
    },
    "/api/Redact/html": {
      "post": {
        "tags": [
          "Text Redaction"
        ],
        "summary": "HTML",
        "description": "Returns a modified version of the HTML that redacts or synthesizes the detected entity values. The redacted HTML has the same structure as the input HTML. Only the text contained in the HTML elements is modified.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json",
          "text/plain",
          "text/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "body",
            "schema": {
              "description": "Request to redact PII from an HTML document.",
              "allOf": [
                {
                  "$ref": "#/definitions/HtmlRedactionRequest"
                }
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the redacted HTML",
            "schema": {
              "$ref": "#/definitions/RedactionSdkModel"
            }
          },
          "400": {
            "description": "Invalid HTML input",
            "schema": {
              "type": "string"
            }
          }
        }
      }
    },
    "/api/UsageRecord/usage_report_csv": {
      "get": {
        "tags": [
          "Usage"
        ],
        "summary": "Export usage report as CSV",
        "description": "Exports a CSV report of word usage records for your organization. Optionally filter by date range. Not available in hosted environments.\n### Required Permissions\n\n- **Global:** View Usage Metrics\n",
        "produces": [
          "text/csv",
          "text/plain",
          "application/json",
          "text/json"
        ],
        "parameters": [
          {
            "in": "query",
            "name": "startDate",
            "description": "Start of the date range filter (ISO 8601)",
            "type": "string",
            "format": "date-time"
          },
          {
            "in": "query",
            "name": "endDate",
            "description": "End of the date range filter (ISO 8601)",
            "type": "string",
            "format": "date-time"
          }
        ],
        "responses": {
          "200": {
            "description": "Usage report as a CSV file",
            "schema": {
              "type": "string",
              "format": "binary"
            }
          },
          "400": {
            "description": "Not available in hosted environments",
            "schema": {
              "$ref": "#/definitions/ProblemDetails"
            }
          }
        }
      }
    },
    "/api/Users": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "List users",
        "description": "Returns all users in your organization. Users with 'Manage Users and Groups' permission receive additional account metadata. Pass includeDeleted=true (requires 'Manage Users and Groups') to also include soft-deleted users.\n### Required Permissions\n\n- **Global:** View Users And Groups\n",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "query",
            "name": "includeDeleted",
            "type": "boolean"
          }
        ],
        "responses": {
          "200": {
            "description": "Returns organization users",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/EnrichedUserEntityModel"
              }
            }
          }
        }
      }
    }
  },
  "definitions": {
    "AgentConnectionModel": {
      "type": "object",
      "description": "Management-surface view of an `AgentUserConnection` row. Deliberately excludes the\nrefresh token and any other encrypted/secret field — never serialize the entity directly.",
      "required": [
        "createdDate",
        "externalAccountEmail",
        "id",
        "provider",
        "status"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "provider": {
          "type": "string"
        },
        "externalAccountEmail": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "statusReason": {
          "type": "string",
          "x-nullable": true
        },
        "createdDate": {
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ]
        },
        "lastUsedDate": {
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ],
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "AuditEventCategory": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>PermissionSet</b>: Contains events for management of permission sets in the application</li>\n<li><b>AssignedPermissions</b>: Contains events for permissions that are granted to users or groups for all datasets.</li>\n<li><b>UserAuthentication</b>: Contains events for user authentication</li>\n<li><b>UserAccountManagement</b>: Contains events for user account management</li>\n<li><b>Api</b>: Contains events for API authentication and authorization</li>\n<li><b>CustomEntityTypes</b>: Contains events for custom entity types</li>\n<li><b>Marketplace</b>: Contains events for material changes to an organization driven by the GCP Marketplace lifecycle (entitlement attach, plan change, cancellation).</li>\n<li><b>OAuth</b>: Contains events for material trust decisions in the A2A OAuth flow — currently just consent grants (the user approving a third-party client's persistent access).</li>\n<li><b>Dataset</b>: Contains events for actions taken on a dataset and its files: file uploads, downloads, deletions, and changes to dataset configuration. Scoped to a single dataset via the AuditEvent.DatasetId column.</li>\n<li><b>AgentConnection</b>: Contains events for per-user connections from the A2A agent to external file stores (Google Drive; future S3/Azure Blob/SharePoint) and file operations performed through them.</li>\n</ul>\n",
      "enum": [
        "PermissionSet",
        "AssignedPermissions",
        "UserAuthentication",
        "UserAccountManagement",
        "Api",
        "CustomEntityTypes",
        "Marketplace",
        "OAuth",
        "Dataset",
        "AgentConnection"
      ]
    },
    "AuditEventModel": {
      "type": "object",
      "description": "Contains the details for an audit event included in the results of a GET /api/audit-events/search request.",
      "properties": {
        "id": {
          "type": "string",
          "description": "The unique identifier of the audit event."
        },
        "timestamp": {
          "description": "The time the event occurred.",
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ]
        },
        "eventCategory": {
          "description": "The general category of the event (e.g. PermissionSet, AssignedPermissions).<p>Possible values:</p>\n<ul>\n<li><b>PermissionSet</b>: Contains events for management of permission sets in the application</li>\n<li><b>AssignedPermissions</b>: Contains events for permissions that are granted to users or groups for all datasets.</li>\n<li><b>UserAuthentication</b>: Contains events for user authentication</li>\n<li><b>UserAccountManagement</b>: Contains events for user account management</li>\n<li><b>Api</b>: Contains events for API authentication and authorization</li>\n<li><b>CustomEntityTypes</b>: Contains events for custom entity types</li>\n<li><b>Marketplace</b>: Contains events for material changes to an organization driven by the GCP Marketplace lifecycle (entitlement attach, plan change, cancellation).</li>\n<li><b>OAuth</b>: Contains events for material trust decisions in the A2A OAuth flow — currently just consent grants (the user approving a third-party client's persistent access).</li>\n<li><b>Dataset</b>: Contains events for actions taken on a dataset and its files: file uploads, downloads, deletions, and changes to dataset configuration. Scoped to a single dataset via the AuditEvent.DatasetId column.</li>\n<li><b>AgentConnection</b>: Contains events for per-user connections from the A2A agent to external file stores (Google Drive; future S3/Azure Blob/SharePoint) and file operations performed through them.</li>\n</ul>\n",
          "enum": [
            "PermissionSet",
            "AssignedPermissions",
            "UserAuthentication",
            "UserAccountManagement",
            "Api",
            "CustomEntityTypes",
            "Marketplace",
            "OAuth",
            "Dataset",
            "AgentConnection"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/AuditEventCategory"
            }
          ]
        },
        "eventType": {
          "description": "The specific type of event (e.g. PermissionSetCreated, PermissionSetUpdated).<p>Possible values:</p>\n<ul>\n<li><b>MarketplaceEntitlementAttached</b>: A GCP Marketplace entitlement was first attached to an organization (cold-start).</li>\n<li><b>MarketplaceEntitlementPlanChanged</b>: A GCP Marketplace entitlement plan change was approved.</li>\n<li><b>MarketplaceEntitlementCancelled</b>: A GCP Marketplace entitlement was cancelled or deleted (license revoked, refresh tokens swept). Non-deprovisioned state pumps (active↔suspended without permanent change) are NOT audited — they live in the structured log.</li>\n<li><b>OAuthConsentGranted</b>: The user approved an A2A OAuth consent grant. This is the user's material trust decision; per-issuance token rotations are deliberately not audited.</li>\n<li><b>DatasetFileUploaded</b>: A file was uploaded to a dataset.</li>\n<li><b>DatasetFileDownloaded</b>: A dataset file was downloaded (single file, in any output format).</li>\n<li><b>DatasetFilesDownloadedBulk</b>: Multiple dataset files were downloaded together (download-all / bulk export).</li>\n<li><b>DatasetFileDeleted</b>: A file was deleted from a dataset.</li>\n<li><b>DatasetCreated</b>: A dataset was created.</li>\n<li><b>DatasetDeleted</b>: A dataset was deleted.</li>\n<li><b>DatasetConfigurationChanged</b>: A dataset's configuration (name, generators, policies, label lists) was changed.</li>\n<li><b>DatasetSettingsImported</b>: A dataset's settings were imported from another dataset.</li>\n<li><b>DatasetTagsUpdated</b>: A dataset's tags were updated.</li>\n<li><b>DatasetVersionRestored</b>: A dataset was restored to a prior configuration version.</li>\n<li><b>DatasetPdfRedactionAdded</b>: A manual PDF redaction was added to a dataset file.</li>\n<li><b>DatasetPdfRedactionRemoved</b>: A manual PDF redaction was removed from a dataset file.</li>\n<li><b>DatasetCustomEntityActivated</b>: A custom or model-based entity type was activated (enabled) for a dataset.</li>\n<li><b>DatasetCustomEntityDeactivated</b>: A custom or model-based entity type was deactivated (disabled) for a dataset.</li>\n<li><b>ModelBasedEntityRenamed</b>: A model-based entity was renamed (display name + internal label) via the Entity Type Library Gateway curation surface.</li>\n<li><b>UserPasswordResetLinkGenerated</b>: An admin generated a self-service password-reset link for another user (self-hosted only).</li>\n<li><b>MarketplaceAccessRevocationRecovered</b>: A redelivered Pub/Sub event completed revocation (refresh tokens + Marketplace A2A OAuth clients) that a prior delivery had left outstanding after already committing the entitlement's cancelled/deprovisioned state. Distinct from</li>\n<li><b>DatasetFormMappingSuppressionChanged</b>: A form mapping (\"form label mapping\") match was suppressed or un-suppressed for a single dataset file, at either grain (whole mapped field, or one occurrence of it). The metadata carries the canonical key, the grain, and the direction.</li>\n<li><b>RegexEntityExported</b>: A regex-based entity was exported.</li>\n<li><b>RegexEntityImported</b>: A regex-based entity was imported.</li>\n<li><b>CustomEntityImportFailed</b>: An entity import failed before its kind could be determined.</li>\n<li><b>AgentConnectionAuthorized</b>: The user completed provider consent for an agent connection (e.g. Google Drive) and the connection was stored.</li>\n<li><b>AgentConnectionDisconnected</b>: An agent connection was disconnected. Metadata distinguishes the user disconnecting their own connection from an org admin disconnecting it.</li>\n<li><b>AgentConnectionRevokedExternally</b>: An agent connection's revocation was detected externally (e.g. `invalid_grant` on a refresh attempt, or a provider admin policy blocking access). Emitted once at detection, not per failed call.</li>\n</ul>\n",
          "enum": [
            "UserCreated",
            "UserRemoved",
            "UserLogin",
            "ApiAuthentication",
            "ApiAuthorization",
            "PermissionSetCreated",
            "PermissionSetUpdated",
            "PermissionSetDeleted",
            "GlobalPermissionSetAssigned",
            "GlobalPermissionSetRevoked",
            "DatasetPermissionSetAssigned",
            "DatasetPermissionSetRevoked",
            "ModelBasedEntityExported",
            "ModelBasedEntityImported",
            "MarketplaceEntitlementAttached",
            "MarketplaceEntitlementPlanChanged",
            "MarketplaceEntitlementCancelled",
            "OAuthConsentGranted",
            "DatasetFileUploaded",
            "DatasetFileDownloaded",
            "DatasetFilesDownloadedBulk",
            "DatasetFileDeleted",
            "DatasetCreated",
            "DatasetDeleted",
            "DatasetConfigurationChanged",
            "DatasetSettingsImported",
            "DatasetTagsUpdated",
            "DatasetVersionRestored",
            "DatasetPdfRedactionAdded",
            "DatasetPdfRedactionRemoved",
            "DatasetCustomEntityActivated",
            "DatasetCustomEntityDeactivated",
            "ModelBasedEntityRenamed",
            "UserPasswordResetLinkGenerated",
            "MarketplaceAccessRevocationRecovered",
            "DatasetFormMappingSuppressionChanged",
            "RegexEntityExported",
            "RegexEntityImported",
            "CustomEntityImportFailed",
            "AgentConnectionAuthorized",
            "AgentConnectionDisconnected",
            "AgentConnectionRevokedExternally"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/AuditEventType"
            }
          ]
        },
        "outcome": {
          "description": "Whether the event was successful or failed.",
          "enum": [
            "Fail",
            "Success"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/AuditEventOutcome"
            }
          ]
        },
        "user": {
          "type": "string",
          "description": "The user who performed or triggered the event."
        },
        "message": {
          "type": "string",
          "description": "A human-readable description of the event."
        },
        "requestSource": {
          "description": "How the actor communicated with Tonic (UI, API key, SDK, MCP, etc.).",
          "allOf": [
            {
              "$ref": "#/definitions/AuditEventRequestSource"
            }
          ],
          "x-nullable": true
        },
        "metadata": {
          "description": "Additional structured data associated with the event, if any.",
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "AuditEventModelPaginationResponseModel": {
      "type": "object",
      "description": "Paginated response wrapper containing a page of results along with pagination metadata.",
      "required": [
        "records"
      ],
      "properties": {
        "offset": {
          "type": "integer",
          "description": "The offset from the first item in the results. For example, 20 indicates that this batch of results starts with the 21st result.",
          "format": "int32"
        },
        "limit": {
          "type": "integer",
          "description": "The number of items the request limited the search to. The number of returned items can be less than the limit if not enough items exist or match the filter criteria.",
          "format": "int32"
        },
        "pageNumber": {
          "type": "integer",
          "description": "The number for this page of the results, starting at 1.",
          "format": "int32"
        },
        "totalPages": {
          "type": "integer",
          "description": "The total number of pages in the results.",
          "format": "int32"
        },
        "totalRecords": {
          "type": "integer",
          "description": "The total number of records in the results.",
          "format": "int32"
        },
        "absoluteTotalRecords": {
          "type": "integer",
          "description": "The absolute total number of records available (unfiltered). This represents the total count without any search or filter applied.",
          "format": "int32"
        },
        "hasPreviousPage": {
          "type": "boolean",
          "description": "Whether there is a previous page of results."
        },
        "hasNextPage": {
          "type": "boolean",
          "description": "Whether there is a next page of results."
        },
        "records": {
          "type": "array",
          "description": "An array of returned records.",
          "items": {
            "$ref": "#/definitions/AuditEventModel"
          }
        }
      },
      "additionalProperties": false
    },
    "AuditEventOutcome": {
      "type": "string",
      "description": "The status of the audit event. Some event types may only log Success or Fail events.",
      "enum": [
        "Fail",
        "Success"
      ]
    },
    "AuditEventRequestSource": {
      "type": "string",
      "description": "Identifies how the actor communicated with Tonic when an audit event was produced — i.e. the\ncredential/client source behind the request. Answers \"was this driven through the UI or\nprogrammatically, and if programmatically, via what?\".<p>Possible values:</p>\n<ul>\n<li><b>Unknown</b>: The request could not be attributed to a known source (e.g. an authenticated request whose credential kind was unclassifiable, or an unauthenticated request).</li>\n<li><b>Ui</b>: Driven interactively through the browser UI (JWT/cookie bearer authentication).</li>\n<li><b>ApiKey</b>: A programmatic request authenticated with a user API key (no more specific client identified).</li>\n<li><b>PythonSdk</b>: A programmatic request from the Textual Python SDK (API key + SDK User-Agent).</li>\n<li><b>McpServer</b>: A programmatic request from the Textual MCP server (API key + MCP User-Agent).</li>\n<li><b>A2aOAuth</b>: An agent-to-agent (A2A) OAuth flow.</li>\n<li><b>OnBehalfOfUser</b>: An on-behalf-of-user delegated token.</li>\n<li><b>Fabric</b>: A Fabric session.</li>\n<li><b>ServerInitiated</b>: Produced by the server with no originating HTTP request (background workers, scheduled jobs, EF</li>\n</ul>\n",
      "enum": [
        "Unknown",
        "Ui",
        "ApiKey",
        "PythonSdk",
        "McpServer",
        "A2aOAuth",
        "OnBehalfOfUser",
        "Fabric",
        "ServerInitiated"
      ]
    },
    "AuditEventType": {
      "type": "string",
      "description": "The specific type of audit event, such as user creation, login, or permission changes.<p>Possible values:</p>\n<ul>\n<li><b>MarketplaceEntitlementAttached</b>: A GCP Marketplace entitlement was first attached to an organization (cold-start).</li>\n<li><b>MarketplaceEntitlementPlanChanged</b>: A GCP Marketplace entitlement plan change was approved.</li>\n<li><b>MarketplaceEntitlementCancelled</b>: A GCP Marketplace entitlement was cancelled or deleted (license revoked, refresh tokens swept). Non-deprovisioned state pumps (active↔suspended without permanent change) are NOT audited — they live in the structured log.</li>\n<li><b>OAuthConsentGranted</b>: The user approved an A2A OAuth consent grant. This is the user's material trust decision; per-issuance token rotations are deliberately not audited.</li>\n<li><b>DatasetFileUploaded</b>: A file was uploaded to a dataset.</li>\n<li><b>DatasetFileDownloaded</b>: A dataset file was downloaded (single file, in any output format).</li>\n<li><b>DatasetFilesDownloadedBulk</b>: Multiple dataset files were downloaded together (download-all / bulk export).</li>\n<li><b>DatasetFileDeleted</b>: A file was deleted from a dataset.</li>\n<li><b>DatasetCreated</b>: A dataset was created.</li>\n<li><b>DatasetDeleted</b>: A dataset was deleted.</li>\n<li><b>DatasetConfigurationChanged</b>: A dataset's configuration (name, generators, policies, label lists) was changed.</li>\n<li><b>DatasetSettingsImported</b>: A dataset's settings were imported from another dataset.</li>\n<li><b>DatasetTagsUpdated</b>: A dataset's tags were updated.</li>\n<li><b>DatasetVersionRestored</b>: A dataset was restored to a prior configuration version.</li>\n<li><b>DatasetPdfRedactionAdded</b>: A manual PDF redaction was added to a dataset file.</li>\n<li><b>DatasetPdfRedactionRemoved</b>: A manual PDF redaction was removed from a dataset file.</li>\n<li><b>DatasetCustomEntityActivated</b>: A custom or model-based entity type was activated (enabled) for a dataset.</li>\n<li><b>DatasetCustomEntityDeactivated</b>: A custom or model-based entity type was deactivated (disabled) for a dataset.</li>\n<li><b>ModelBasedEntityRenamed</b>: A model-based entity was renamed (display name + internal label) via the Entity Type Library Gateway curation surface.</li>\n<li><b>UserPasswordResetLinkGenerated</b>: An admin generated a self-service password-reset link for another user (self-hosted only).</li>\n<li><b>MarketplaceAccessRevocationRecovered</b>: A redelivered Pub/Sub event completed revocation (refresh tokens + Marketplace A2A OAuth clients) that a prior delivery had left outstanding after already committing the entitlement's cancelled/deprovisioned state. Distinct from</li>\n<li><b>DatasetFormMappingSuppressionChanged</b>: A form mapping (\"form label mapping\") match was suppressed or un-suppressed for a single dataset file, at either grain (whole mapped field, or one occurrence of it). The metadata carries the canonical key, the grain, and the direction.</li>\n<li><b>RegexEntityExported</b>: A regex-based entity was exported.</li>\n<li><b>RegexEntityImported</b>: A regex-based entity was imported.</li>\n<li><b>CustomEntityImportFailed</b>: An entity import failed before its kind could be determined.</li>\n<li><b>AgentConnectionAuthorized</b>: The user completed provider consent for an agent connection (e.g. Google Drive) and the connection was stored.</li>\n<li><b>AgentConnectionDisconnected</b>: An agent connection was disconnected. Metadata distinguishes the user disconnecting their own connection from an org admin disconnecting it.</li>\n<li><b>AgentConnectionRevokedExternally</b>: An agent connection's revocation was detected externally (e.g. `invalid_grant` on a refresh attempt, or a provider admin policy blocking access). Emitted once at detection, not per failed call.</li>\n</ul>\n",
      "enum": [
        "UserCreated",
        "UserRemoved",
        "UserLogin",
        "ApiAuthentication",
        "ApiAuthorization",
        "PermissionSetCreated",
        "PermissionSetUpdated",
        "PermissionSetDeleted",
        "GlobalPermissionSetAssigned",
        "GlobalPermissionSetRevoked",
        "DatasetPermissionSetAssigned",
        "DatasetPermissionSetRevoked",
        "ModelBasedEntityExported",
        "ModelBasedEntityImported",
        "MarketplaceEntitlementAttached",
        "MarketplaceEntitlementPlanChanged",
        "MarketplaceEntitlementCancelled",
        "OAuthConsentGranted",
        "DatasetFileUploaded",
        "DatasetFileDownloaded",
        "DatasetFilesDownloadedBulk",
        "DatasetFileDeleted",
        "DatasetCreated",
        "DatasetDeleted",
        "DatasetConfigurationChanged",
        "DatasetSettingsImported",
        "DatasetTagsUpdated",
        "DatasetVersionRestored",
        "DatasetPdfRedactionAdded",
        "DatasetPdfRedactionRemoved",
        "DatasetCustomEntityActivated",
        "DatasetCustomEntityDeactivated",
        "ModelBasedEntityRenamed",
        "UserPasswordResetLinkGenerated",
        "MarketplaceAccessRevocationRecovered",
        "DatasetFormMappingSuppressionChanged",
        "RegexEntityExported",
        "RegexEntityImported",
        "CustomEntityImportFailed",
        "AgentConnectionAuthorized",
        "AgentConnectionDisconnected",
        "AgentConnectionRevokedExternally"
      ]
    },
    "AwsCredentialSource": {
      "type": "string",
      "description": "How AWS credentials are provided: directly by the user or from the server environment.",
      "enum": [
        "UserProvided",
        "FromEnvironment",
        "AssumeRole"
      ]
    },
    "AwsS3SseEncryptionType": {
      "type": "string",
      "description": "Enum outlining supported AWS Server Side Encryption types for S3. \n\nhttps://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html",
      "enum": [
        "S3",
        "Kms"
      ]
    },
    "BaseApiRedactionRequest": {
      "type": "object",
      "description": "Base redaction request containing shared options for entity detection, synthesis configuration, and document processing policies.",
      "properties": {
        "generatorConfig": {
          "type": "object",
          "description": "A dictionary of entity types to their transformation type.",
          "example": {
            "NAME_GIVEN": "Redaction",
            "NAME_FAMILY": "Redaction"
          }
        },
        "generatorDefault": {
          "description": "The default type of transformation to apply to each entity.<p>Possible values:</p>\n<ul>\n<li><b>Off</b>: Ignore the PII type</li>\n<li><b>Synthesis</b>: Synthesize a new, realistic entity</li>\n<li><b>Redaction</b>: Tokenize the entity, e.g. [NAME_GIVEN_ssys5]</li>\n<li><b>GroupingSynthesis</b>: Synthesize entities using consistent grouping across the document</li>\n<li><b>ReplacementSynthesis</b>: Replace entities with LLM generated values. ReplacementSynthesis is no longer used</li>\n</ul>\n",
          "enum": [
            "Off",
            "Synthesis",
            "Redaction",
            "GroupingSynthesis",
            "ReplacementSynthesis"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PiiTypeGeneratorStateEnum"
            }
          ],
          "example": "Off"
        },
        "docXImagePolicy": {
          "description": "Policy for handling DocX Images<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Run images through OCR and redact sensitive text</li>\n<li><b>Ignore</b>: Leave images alone</li>\n<li><b>Remove</b>: Cover image with opaque black box</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXImagePolicy"
            }
          ]
        },
        "rtfImagePolicy": {
          "description": "Policy for handling images in RTF files (JSON datasets only)<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave images alone</li>\n<li><b>Remove</b>: Replace each image with an opaque black box of the same size</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/RtfImagePolicy"
            }
          ]
        },
        "docXCommentPolicy": {
          "description": "Policy for handling DocX comments<p>Possible values:</p>\n<ul>\n<li><b>Remove</b>: Remove all comments for file</li>\n<li><b>Ignore</b>: Leave comments alone</li>\n</ul>\n",
          "enum": [
            "Remove",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXCommentPolicy"
            }
          ]
        },
        "pdfSignaturePolicy": {
          "description": "Policy for handling PDF signatures<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Cover signature with opaque black box</li>\n<li><b>Ignore</b>: Do not attempt to detect signature</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PdfSignaturePolicy"
            }
          ]
        },
        "pdfSynthModePolicy": {
          "description": "Policy for handling PDF and image synthesis mode<p>Possible values:</p>\n<ul>\n<li><b>V1</b>: Original mode with incorrect font, size and style</li>\n<li><b>V2</b>: Legacy style-aware mode. Persisted V2 values now use the V5 font detector.</li>\n<li><b>V5</b>: Style-aware mode backed by the V5 OpenVINO font model</li>\n</ul>\n",
          "enum": [
            "V1",
            "V2",
            "V5"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PdfSynthModePolicy"
            }
          ]
        },
        "docXTablePolicy": {
          "description": "Policy for handling tables in Word Documents<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Treat table content normally, feed into redaction process.</li>\n<li><b>Remove</b>: Replace all characters and symbols in table with a placeholder.</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXTablePolicy"
            }
          ]
        },
        "pptxImagePolicy": {
          "description": "Policy for handling pictures in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Run pictures embedded in slides and speaker notes through OCR and redact sensitive text</li>\n<li><b>Ignore</b>: Leave pictures alone</li>\n<li><b>Remove</b>: Replace each picture with an opaque black box of the same size</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxImagePolicy"
            }
          ]
        },
        "pptxCommentPolicy": {
          "description": "Policy for handling comments in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Remove</b>: Remove all comments (and comment authors) from the presentation</li>\n<li><b>Ignore</b>: Leave comments alone</li>\n</ul>\n",
          "enum": [
            "Remove",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxCommentPolicy"
            }
          ]
        },
        "pptxTablePolicy": {
          "description": "Policy for handling tables in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Treat table content normally, feed into redaction process.</li>\n<li><b>Remove</b>: Replace all characters and symbols in table cells with a placeholder.</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxTablePolicy"
            }
          ]
        },
        "pptxLogoPolicy": {
          "description": "Policy for detected logos in PowerPoint pictures: Ignore (default) or Remove (paint black)<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected logos in pictures alone</li>\n<li><b>Remove</b>: Paint detected logos in slide, notes, layout and master pictures black, regardless of the image policy.</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxLogoPolicy"
            }
          ]
        },
        "pptxSignaturePolicy": {
          "description": "Policy for detected signatures in PowerPoint pictures: Ignore (default) or Remove (paint black). Replaces the PDF signature policy for PowerPoint pictures.<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected signatures in pictures alone. The default: a deck's pictures are mostly icons, charts and photos, which the detector confuses with signatures, and a slide rarely carries a real one.</li>\n<li><b>Remove</b>: Paint detected signatures in slide, notes, layout and master pictures black, regardless of the image policy. For pictures hosted by a presentation this replaces</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxSignaturePolicy"
            }
          ]
        },
        "pptxFacePolicy": {
          "description": "Policy for detected faces in PowerPoint pictures: Ignore (default) or Remove (paint black). Independent of the PowerPoint image policy.<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected faces in pictures alone. The default.</li>\n<li><b>Remove</b>: Paint detected faces in slide, notes, layout and master pictures black, regardless of the image policy.</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxFacePolicy"
            }
          ]
        },
        "llmClassificationPolicy": {
          "description": "Controls LLM use for entity processing. Enabled reviews detected entities. PdfIdentificationAndSynthesis uses the LLM for dataset PDF PII identification and synthesis. Both modes add latency and require an LLM to be configured on the instance.<p>Possible values:</p>\n<ul>\n<li><b>Disabled</b>: Do not use LLM for structured data classification</li>\n<li><b>Enabled</b>: Use LLM to classify structured data for PII detection</li>\n<li><b>PdfIdentificationAndSynthesis</b>: Use an LLM instead of the NER model and C# generators for PDF PII identification and synthesis. Other file types continue to use their existing detection and synthesis paths.</li>\n</ul>\n",
          "enum": [
            "Disabled",
            "Enabled",
            "PdfIdentificationAndSynthesis"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/LlmClassificationPolicy"
            }
          ]
        },
        "llmTableClassificationPolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/LlmClassificationPolicy"
            }
          ],
          "x-nullable": true
        },
        "labelBlockLists": {
          "type": "object",
          "description": "A list of regexes to match against the specified entity type for exclusion. Legacy strings inputs are accepted and normalized into regexes.",
          "example": {
            "NAME_FAMILY": {
              "regexes": [
                ".*\\s(disease|syndrom|disorder)"
              ]
            }
          }
        },
        "labelAllowLists": {
          "type": "object",
          "description": "A list of regexes to match against the specified entity type for inclusion. Legacy strings inputs are accepted and normalized into regexes.",
          "example": {
            "HEALTHCARE_ID": {
              "regexes": [
                "[a-z]{2}\\d{9}"
              ]
            }
          }
        },
        "generatorMetadata": {
          "type": "object",
          "description": "A dictionary mapping entity type names to their transformation metadata configuration."
        },
        "recordApiRequestOptions": {
          "description": "Options for recording an API request for audit review, including tagging.",
          "allOf": [
            {
              "$ref": "#/definitions/RecordApiRequestOptions"
            }
          ],
          "x-nullable": true
        },
        "customPiiEntityIds": {
          "type": "array",
          "description": "A list of custom Pii Entity names to use for NER",
          "items": {
            "type": "string"
          },
          "x-nullable": true
        },
        "customEntityRankingModes": {
          "type": "object",
          "description": "Optional per-entity ranking overrides for custom-PII and model-based entities detected in\nthis request. Keys are entity Names (the same identifiers used in Solar.Core.Models.BaseApiRedactionRequest.CustomPiiEntityIds);\nvalues control whether the custom entity always wins an exact-boundary overlap against a\nbuilt-in entity (`Prioritized`) or is compared by score (`Standard`). Omit to keep\ntoday's behavior of treating every requested custom entity as Prioritized. Supplying a key\nthat does not match any requested custom-PII or model-based entity Name is rejected as a\n400 error.",
          "example": {
            "MY_CUSTOM_ENTITY": "Standard"
          },
          "x-nullable": true
        },
        "customEntityConfidenceThresholds": {
          "type": "object",
          "description": "Optional per-entity minimum detection confidence thresholds for custom-PII and model-based\nentities detected in this request. Keys are entity Names (the same identifiers used in\nSolar.Core.Models.BaseApiRedactionRequest.CustomPiiEntityIds); each value is in (0, 1], and detections for that entity\nwhose score falls below it are ignored. Omit to keep today's behavior of no confidence\ncutoff. Supplying a key that does not match any requested custom-PII or model-based entity\nName, or a value outside (0, 1], is rejected as a 400 error.",
          "additionalProperties": {
            "type": "number",
            "format": "double"
          },
          "example": {
            "MY_CUSTOM_ENTITY": 0.5
          },
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "BaseMetadata": {
      "type": "object",
      "description": "Synthesis configuration for an entity type, controlling generator version, value swaps, and transformation style.",
      "properties": {
        "version": {
          "description": "Generator version to use for synthesis<p>Possible values:</p>\n<ul>\n<li><b>V1</b>: Original implementation</li>\n<li><b>V2</b>: Length-aware implementation</li>\n</ul>\n",
          "enum": [
            "V1",
            "V2"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/GeneratorVersion"
            }
          ]
        },
        "customGenerator": {
          "description": "Optional custom generator override for this entity type",
          "allOf": [
            {
              "$ref": "#/definitions/GeneratorEnum"
            }
          ],
          "x-nullable": true
        },
        "swaps": {
          "type": "object",
          "description": "A dictionary of original values to specific replacement values for deterministic substitution"
        },
        "constantValue": {
          "type": "string",
          "description": "A value used as the substitution, if set",
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "BulkApiRedactionRequest": {
      "type": "object",
      "description": "Request model for bulk plain text redaction.",
      "properties": {
        "generatorConfig": {
          "type": "object",
          "description": "A dictionary of entity types to their transformation type.",
          "example": {
            "NAME_GIVEN": "Redaction",
            "NAME_FAMILY": "Redaction"
          }
        },
        "generatorDefault": {
          "description": "The default type of transformation to apply to each entity.<p>Possible values:</p>\n<ul>\n<li><b>Off</b>: Ignore the PII type</li>\n<li><b>Synthesis</b>: Synthesize a new, realistic entity</li>\n<li><b>Redaction</b>: Tokenize the entity, e.g. [NAME_GIVEN_ssys5]</li>\n<li><b>GroupingSynthesis</b>: Synthesize entities using consistent grouping across the document</li>\n<li><b>ReplacementSynthesis</b>: Replace entities with LLM generated values. ReplacementSynthesis is no longer used</li>\n</ul>\n",
          "enum": [
            "Off",
            "Synthesis",
            "Redaction",
            "GroupingSynthesis",
            "ReplacementSynthesis"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PiiTypeGeneratorStateEnum"
            }
          ],
          "example": "Off"
        },
        "docXImagePolicy": {
          "description": "Policy for handling DocX Images<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Run images through OCR and redact sensitive text</li>\n<li><b>Ignore</b>: Leave images alone</li>\n<li><b>Remove</b>: Cover image with opaque black box</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXImagePolicy"
            }
          ]
        },
        "rtfImagePolicy": {
          "description": "Policy for handling images in RTF files (JSON datasets only)<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave images alone</li>\n<li><b>Remove</b>: Replace each image with an opaque black box of the same size</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/RtfImagePolicy"
            }
          ]
        },
        "docXCommentPolicy": {
          "description": "Policy for handling DocX comments<p>Possible values:</p>\n<ul>\n<li><b>Remove</b>: Remove all comments for file</li>\n<li><b>Ignore</b>: Leave comments alone</li>\n</ul>\n",
          "enum": [
            "Remove",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXCommentPolicy"
            }
          ]
        },
        "pdfSignaturePolicy": {
          "description": "Policy for handling PDF signatures<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Cover signature with opaque black box</li>\n<li><b>Ignore</b>: Do not attempt to detect signature</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PdfSignaturePolicy"
            }
          ]
        },
        "pdfSynthModePolicy": {
          "description": "Policy for handling PDF and image synthesis mode<p>Possible values:</p>\n<ul>\n<li><b>V1</b>: Original mode with incorrect font, size and style</li>\n<li><b>V2</b>: Legacy style-aware mode. Persisted V2 values now use the V5 font detector.</li>\n<li><b>V5</b>: Style-aware mode backed by the V5 OpenVINO font model</li>\n</ul>\n",
          "enum": [
            "V1",
            "V2",
            "V5"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PdfSynthModePolicy"
            }
          ]
        },
        "docXTablePolicy": {
          "description": "Policy for handling tables in Word Documents<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Treat table content normally, feed into redaction process.</li>\n<li><b>Remove</b>: Replace all characters and symbols in table with a placeholder.</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXTablePolicy"
            }
          ]
        },
        "pptxImagePolicy": {
          "description": "Policy for handling pictures in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Run pictures embedded in slides and speaker notes through OCR and redact sensitive text</li>\n<li><b>Ignore</b>: Leave pictures alone</li>\n<li><b>Remove</b>: Replace each picture with an opaque black box of the same size</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxImagePolicy"
            }
          ]
        },
        "pptxCommentPolicy": {
          "description": "Policy for handling comments in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Remove</b>: Remove all comments (and comment authors) from the presentation</li>\n<li><b>Ignore</b>: Leave comments alone</li>\n</ul>\n",
          "enum": [
            "Remove",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxCommentPolicy"
            }
          ]
        },
        "pptxTablePolicy": {
          "description": "Policy for handling tables in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Treat table content normally, feed into redaction process.</li>\n<li><b>Remove</b>: Replace all characters and symbols in table cells with a placeholder.</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxTablePolicy"
            }
          ]
        },
        "pptxLogoPolicy": {
          "description": "Policy for detected logos in PowerPoint pictures: Ignore (default) or Remove (paint black)<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected logos in pictures alone</li>\n<li><b>Remove</b>: Paint detected logos in slide, notes, layout and master pictures black, regardless of the image policy.</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxLogoPolicy"
            }
          ]
        },
        "pptxSignaturePolicy": {
          "description": "Policy for detected signatures in PowerPoint pictures: Ignore (default) or Remove (paint black). Replaces the PDF signature policy for PowerPoint pictures.<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected signatures in pictures alone. The default: a deck's pictures are mostly icons, charts and photos, which the detector confuses with signatures, and a slide rarely carries a real one.</li>\n<li><b>Remove</b>: Paint detected signatures in slide, notes, layout and master pictures black, regardless of the image policy. For pictures hosted by a presentation this replaces</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxSignaturePolicy"
            }
          ]
        },
        "pptxFacePolicy": {
          "description": "Policy for detected faces in PowerPoint pictures: Ignore (default) or Remove (paint black). Independent of the PowerPoint image policy.<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected faces in pictures alone. The default.</li>\n<li><b>Remove</b>: Paint detected faces in slide, notes, layout and master pictures black, regardless of the image policy.</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxFacePolicy"
            }
          ]
        },
        "llmClassificationPolicy": {
          "description": "Controls LLM use for entity processing. Enabled reviews detected entities. PdfIdentificationAndSynthesis uses the LLM for dataset PDF PII identification and synthesis. Both modes add latency and require an LLM to be configured on the instance.<p>Possible values:</p>\n<ul>\n<li><b>Disabled</b>: Do not use LLM for structured data classification</li>\n<li><b>Enabled</b>: Use LLM to classify structured data for PII detection</li>\n<li><b>PdfIdentificationAndSynthesis</b>: Use an LLM instead of the NER model and C# generators for PDF PII identification and synthesis. Other file types continue to use their existing detection and synthesis paths.</li>\n</ul>\n",
          "enum": [
            "Disabled",
            "Enabled",
            "PdfIdentificationAndSynthesis"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/LlmClassificationPolicy"
            }
          ]
        },
        "llmTableClassificationPolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/LlmClassificationPolicy"
            }
          ],
          "x-nullable": true
        },
        "labelBlockLists": {
          "type": "object",
          "description": "A list of regexes to match against the specified entity type for exclusion. Legacy strings inputs are accepted and normalized into regexes.",
          "example": {
            "NAME_FAMILY": {
              "regexes": [
                ".*\\s(disease|syndrom|disorder)"
              ]
            }
          }
        },
        "labelAllowLists": {
          "type": "object",
          "description": "A list of regexes to match against the specified entity type for inclusion. Legacy strings inputs are accepted and normalized into regexes.",
          "example": {
            "HEALTHCARE_ID": {
              "regexes": [
                "[a-z]{2}\\d{9}"
              ]
            }
          }
        },
        "generatorMetadata": {
          "type": "object",
          "description": "A dictionary mapping entity type names to their transformation metadata configuration."
        },
        "recordApiRequestOptions": {
          "description": "Options for recording an API request for audit review, including tagging.",
          "allOf": [
            {
              "$ref": "#/definitions/RecordApiRequestOptions"
            }
          ],
          "x-nullable": true
        },
        "customPiiEntityIds": {
          "type": "array",
          "description": "A list of custom Pii Entity names to use for NER",
          "items": {
            "type": "string"
          },
          "x-nullable": true
        },
        "customEntityRankingModes": {
          "type": "object",
          "description": "Optional per-entity ranking overrides for custom-PII and model-based entities detected in\nthis request. Keys are entity Names (the same identifiers used in Solar.Core.Models.BaseApiRedactionRequest.CustomPiiEntityIds);\nvalues control whether the custom entity always wins an exact-boundary overlap against a\nbuilt-in entity (`Prioritized`) or is compared by score (`Standard`). Omit to keep\ntoday's behavior of treating every requested custom entity as Prioritized. Supplying a key\nthat does not match any requested custom-PII or model-based entity Name is rejected as a\n400 error.",
          "example": {
            "MY_CUSTOM_ENTITY": "Standard"
          },
          "x-nullable": true
        },
        "customEntityConfidenceThresholds": {
          "type": "object",
          "description": "Optional per-entity minimum detection confidence thresholds for custom-PII and model-based\nentities detected in this request. Keys are entity Names (the same identifiers used in\nSolar.Core.Models.BaseApiRedactionRequest.CustomPiiEntityIds); each value is in (0, 1], and detections for that entity\nwhose score falls below it are ignored. Omit to keep today's behavior of no confidence\ncutoff. Supplying a key that does not match any requested custom-PII or model-based entity\nName, or a value outside (0, 1], is rejected as a 400 error.",
          "additionalProperties": {
            "type": "number",
            "format": "double"
          },
          "example": {
            "MY_CUSTOM_ENTITY": 0.5
          },
          "x-nullable": true
        },
        "bulkText": {
          "type": "array",
          "description": "An array of text strings to redact. Null entries are preserved as null in the response.",
          "items": {
            "type": "string"
          },
          "example": [
            "My name is John Smith",
            "Jane Doe lives in Atlanta"
          ]
        }
      },
      "additionalProperties": false
    },
    "BulkRedactionSdkModel": {
      "type": "object",
      "description": "The result of a bulk redaction operation, containing the original texts, redacted texts, and details of each entity replacement.",
      "properties": {
        "bulkText": {
          "type": "array",
          "description": "The original input texts before redaction.",
          "items": {
            "type": "string"
          }
        },
        "bulkRedactedText": {
          "type": "array",
          "description": "The texts after redaction has been applied.",
          "items": {
            "type": "string"
          }
        },
        "usage": {
          "type": "integer",
          "description": "The total number of words processed across all texts.",
          "format": "int64"
        },
        "deIdentifyResults": {
          "type": "array",
          "description": "The list of entity replacements that were made during redaction across all texts.",
          "items": {
            "$ref": "#/definitions/ReplacementSdkModel"
          }
        }
      },
      "additionalProperties": false
    },
    "CreateDatasetRequest": {
      "type": "object",
      "description": "Request to create a new dataset for PII detection and redaction.",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the dataset"
        },
        "fileSource": {
          "description": "The original upload location of source files (Local, S3, Azure, SharePoint, OneLake, or SDK).",
          "enum": [
            "Local",
            "Sharepoint",
            "Aws",
            "Sdk",
            "Azure",
            "OneLake"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/FileSource"
            }
          ]
        },
        "awsCredentialSource": {
          "description": "How AWS credentials are being provided, either from user or from environment.  Applicable only to datasets with files in S3",
          "allOf": [
            {
              "$ref": "#/definitions/AwsCredentialSource"
            }
          ],
          "x-nullable": true
        },
        "fileSourceExternalCredential": {
          "description": "Credentials to your file store (S3, Azure Blob Storage, etc)",
          "allOf": [
            {
              "$ref": "#/definitions/FileSourceExternalCredentialApiModel"
            }
          ],
          "x-nullable": true
        },
        "outputFormat": {
          "description": "The output format for redacted files: Original preserves the source format, Markdown produces a markdown version.",
          "enum": [
            "Original",
            "Markdown"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/OutputFormatEnum"
            }
          ]
        },
        "importSettings": {
          "description": "Optional settings to import from another dataset on creation",
          "allOf": [
            {
              "$ref": "#/definitions/ImportDatasetSettingsOptions"
            }
          ],
          "x-nullable": true
        },
        "fileSourceConfig": {
          "description": "Optional per-file-source configuration (e.g. S3 server-side encryption settings).",
          "allOf": [
            {
              "$ref": "#/definitions/FileSourceConfig"
            }
          ],
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "CreateManualReactionProjectRequest": {
      "type": "object",
      "description": "Request to create a new guided redaction project.",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the project"
        },
        "fileSource": {
          "description": "The original upload location of source files (Local, S3, Azure, SharePoint, OneLake, or SDK).",
          "enum": [
            "Local",
            "Sharepoint",
            "Aws",
            "Sdk",
            "Azure",
            "OneLake"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/FileSource"
            }
          ]
        },
        "awsCredentialSource": {
          "description": "How AWS credentials are being provided, either from user or from environment.  Applicable only to projects with files in S3",
          "allOf": [
            {
              "$ref": "#/definitions/AwsCredentialSource"
            }
          ],
          "x-nullable": true
        },
        "fileSourceExternalCredential": {
          "description": "Credentials to your file store (S3, Azure Blob Storage, etc)",
          "allOf": [
            {
              "$ref": "#/definitions/FileSourceExternalCredentialApiModel"
            }
          ],
          "x-nullable": true
        },
        "entityOutputFormat": {
          "description": "Output format of files in project<p>Possible values:</p>\n<ul>\n<li><b>ReferenceCodes</b>: Each entity is replaced with a custom label, specified by user. When not specified, we use the entity label</li>\n<li><b>NoIdentifiers</b>: Each entity is fully redacted with no replacement text</li>\n</ul>\n",
          "enum": [
            "ReferenceCodes",
            "NoIdentifiers"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/ManualRedactionOutputFormatEnum"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    "CustomEntityRankingMode": {
      "type": "string",
      "description": "Controls how a custom entity type competes with built-in entity types when they detect the\nsame span for a dataset. \"Off\" is represented by the absence of an activation row, not an\nenum value.<p>Possible values:</p>\n<ul>\n<li><b>Prioritized</b>: Always prefer the custom entity over an overlapping built-in entity on an exact-boundary tie. This preserves the historical hardcoded behavior and is the default for newly activated entities.</li>\n<li><b>Standard</b>: Rank the custom entity by score alongside built-in entities. On an exact-boundary tie the higher-confidence entity wins.</li>\n</ul>\n",
      "enum": [
        "Prioritized",
        "Standard"
      ]
    },
    "DatasetFormMappingApiModel": {
      "type": "object",
      "description": "A dataset's applied form mapping (\"form label mapping\"): summary of the point-in-time clone\nstored in the dataset's settings, plus the read-time status against the org-level source.",
      "required": [
        "liveSourceVersion",
        "mappedFieldCount",
        "noticeDismissed",
        "sourceFormMappingId",
        "sourceName",
        "sourceVersion",
        "status"
      ],
      "properties": {
        "sourceFormMappingId": {
          "type": "string"
        },
        "sourceName": {
          "type": "string"
        },
        "sourceVersion": {
          "type": "integer",
          "format": "int32"
        },
        "liveSourceVersion": {
          "type": "integer",
          "format": "int32",
          "x-nullable": true
        },
        "mappedFieldCount": {
          "type": "integer",
          "format": "int32"
        },
        "status": {
          "description": "Lifecycle of a dataset's applied form mapping relative to its org-level source,\ncomputed at read time by joining Dataset.FormMappingSourceId to the live FormMapping.\nThe clone is self-contained, so a Stale or SourceDeleted mapping keeps working —\nthese states are informational badges only.<p>Possible values:</p>\n<ul>\n<li><b>Current</b>: The source mapping still exists and has not changed since the clone was taken.</li>\n<li><b>Stale</b>: The source mapping was edited after the clone was taken (source.Version > SourceVersion).</li>\n<li><b>SourceDeleted</b>: The source mapping was deleted; the dataset continues to run off its clone.</li>\n</ul>\n",
          "enum": [
            "Current",
            "Stale",
            "SourceDeleted"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DatasetFormMappingStatus"
            }
          ]
        },
        "noticeDismissed": {
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "DatasetFormMappingStatus": {
      "type": "string",
      "description": "Lifecycle of a dataset's applied form mapping relative to its org-level source,\ncomputed at read time by joining Dataset.FormMappingSourceId to the live FormMapping.\nThe clone is self-contained, so a Stale or SourceDeleted mapping keeps working —\nthese states are informational badges only.<p>Possible values:</p>\n<ul>\n<li><b>Current</b>: The source mapping still exists and has not changed since the clone was taken.</li>\n<li><b>Stale</b>: The source mapping was edited after the clone was taken (source.Version > SourceVersion).</li>\n<li><b>SourceDeleted</b>: The source mapping was deleted; the dataset continues to run off its clone.</li>\n</ul>\n",
      "enum": [
        "Current",
        "Stale",
        "SourceDeleted"
      ]
    },
    "DatasetOperation": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>HasAccess</b>: Ability to access a dataset. Every Dataset Permission Set has this operation.</li>\n<li><b>ViewSettings</b>: View dataset settings</li>\n<li><b>EditSettings</b>: Edit dataset settings</li>\n<li><b>Share</b>: Share dataset access</li>\n<li><b>Delete</b>: Delete a dataset</li>\n<li><b>UploadFiles</b>: Upload files to a dataset</li>\n<li><b>ScanFiles</b>: Start a scan of a dataset file. Scans one file at a time; see</li>\n<li><b>DeleteFiles</b>: Delete files from a dataset</li>\n<li><b>PreviewRedactedFiles</b>: Preview redacted dataset files</li>\n<li><b>DownloadRedactedFiles</b>: Download redacted dataset files</li>\n<li><b>ViewAuditLog</b>: Access a detailed history of actions taken within the dataset for compliance and tracking purposes</li>\n<li><b>EditFileRedactions</b>: Create and delete manual redactions (text spans and PDF/image area redactions) on dataset files. Implied by</li>\n<li><b>ScanAllFiles</b>: Start a scan of all dataset files at once. Implies</li>\n</ul>\n",
      "enum": [
        "HasAccess",
        "ViewSettings",
        "EditSettings",
        "Share",
        "Delete",
        "UploadFiles",
        "ScanFiles",
        "DeleteFiles",
        "PreviewRedactedFiles",
        "DownloadRedactedFiles",
        "ViewAuditLog",
        "EditFileRedactions",
        "ScanAllFiles"
      ]
    },
    "DatasetResponseModel": {
      "type": "object",
      "description": "Full dataset details including files, configuration, and permission information.",
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "generatorMetadata": {
          "type": "object",
          "description": "A dictionary mapping entity type names to their transformation metadata configuration.",
          "x-nullable": true
        },
        "outputFormat": {
          "description": "The output format for redacted files: Original preserves the source format, Markdown produces a markdown version.",
          "enum": [
            "Original",
            "Markdown"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/OutputFormatEnum"
            }
          ]
        },
        "generatorSetup": {
          "type": "object",
          "description": "A dictionary mapping entity type names to their transformation type (e.g. Redaction, Synthesis, Off).",
          "example": "{\"NAME_GIVEN\":\"Redaction\", \"NAME_FAMILY\":\"Redaction\"}",
          "x-nullable": true
        },
        "labelBlockLists": {
          "type": "object",
          "example": "{\"NAME_FAMILY\":{\"regexes\":[\".*\\\\s(disease|syndrom|disorder)\"]}}",
          "x-nullable": true
        },
        "labelAllowLists": {
          "type": "object",
          "example": "{\"HEALTHCARE_ID\":{\"regexes\":[\"[a-z]{2}\\\\d{9}\"]}}",
          "x-nullable": true
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "files": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/FileResponseModel"
          },
          "x-nullable": true
        },
        "lastUpdated": {
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ]
        },
        "created": {
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ]
        },
        "creatorUser": {
          "description": "A user entity with basic identity information.",
          "allOf": [
            {
              "$ref": "#/definitions/UserEntityModel"
            }
          ],
          "x-nullable": true
        },
        "docXImagePolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/DocXImagePolicy"
            }
          ],
          "x-nullable": true
        },
        "rtfImagePolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/RtfImagePolicy"
            }
          ],
          "x-nullable": true
        },
        "pdfSignaturePolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/PdfSignaturePolicy"
            }
          ],
          "x-nullable": true
        },
        "pdfSynthModePolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/PdfSynthModePolicy"
            }
          ],
          "x-nullable": true
        },
        "docXCommentPolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/DocXCommentPolicy"
            }
          ],
          "x-nullable": true
        },
        "docXTablePolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/DocXTablePolicy"
            }
          ],
          "x-nullable": true
        },
        "pptxImagePolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/PptxImagePolicy"
            }
          ],
          "x-nullable": true
        },
        "pptxCommentPolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/PptxCommentPolicy"
            }
          ],
          "x-nullable": true
        },
        "pptxTablePolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/PptxTablePolicy"
            }
          ],
          "x-nullable": true
        },
        "pptxLogoPolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/PptxLogoPolicy"
            }
          ],
          "x-nullable": true
        },
        "pptxSignaturePolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/PptxSignaturePolicy"
            }
          ],
          "x-nullable": true
        },
        "pptxFacePolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/PptxFacePolicy"
            }
          ],
          "x-nullable": true
        },
        "llmClassificationPolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/LlmClassificationPolicy"
            }
          ],
          "x-nullable": true
        },
        "llmTableClassificationPolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/LlmClassificationPolicy"
            }
          ],
          "readOnly": true,
          "x-nullable": true
        },
        "fileSource": {
          "allOf": [
            {
              "$ref": "#/definitions/FileSource"
            }
          ],
          "x-nullable": true
        },
        "customPiiEntityIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "x-nullable": true
        },
        "operations": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/DatasetOperation"
          },
          "x-nullable": true
        },
        "rescanJobs": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/JobModel"
          },
          "x-nullable": true
        },
        "mostRecentExternalFileGenerationJob": {
          "description": "Represents a background processing job with status, timing, and resource association details.",
          "allOf": [
            {
              "$ref": "#/definitions/JobModel"
            }
          ],
          "x-nullable": true
        },
        "fileSourceExternalCredential": {
          "description": "Credentials for connecting to an external file source such as S3, Azure Blob Storage, or SharePoint.",
          "allOf": [
            {
              "$ref": "#/definitions/FileSourceExternalCredentialApiModel"
            }
          ],
          "x-nullable": true
        },
        "awsCredentialSource": {
          "type": "string",
          "x-nullable": true
        },
        "outputPath": {
          "type": "string",
          "x-nullable": true
        },
        "externalFilesInfo": {
          "description": "The external (cloud) file configuration for a dataset or resource.",
          "allOf": [
            {
              "$ref": "#/definitions/ExternalFilesResponseModel"
            }
          ],
          "x-nullable": true
        },
        "ocrServiceProvider": {
          "allOf": [
            {
              "$ref": "#/definitions/OcrServiceProvidersEnum"
            }
          ],
          "x-nullable": true
        },
        "fileCount": {
          "type": "integer",
          "format": "int32"
        },
        "formMapping": {
          "description": "A dataset's applied form mapping (\"form label mapping\"): summary of the point-in-time clone\nstored in the dataset's settings, plus the read-time status against the org-level source.",
          "allOf": [
            {
              "$ref": "#/definitions/DatasetFormMappingApiModel"
            }
          ],
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "DatasetVersionChangeSummary": {
      "type": "object",
      "description": "A single change entry in a dataset version's summary.\nStored as a JSON array in Solar.EF.Models.DatasetVersion.Summary.",
      "properties": {
        "fields": {
          "type": "array",
          "description": "The field(s) that changed. A single-element list for most changes,\n            or multiple elements when a bulk operation applied the same value to many fields\n            (e.g. GeneratorSetup keys all set to the same state).",
          "items": {
            "type": "string"
          }
        },
        "description": {
          "type": "string",
          "description": "Human-readable description, e.g. \"Renamed dataset from 'A' to 'B'\""
        },
        "changeType": {
          "description": "The change type",
          "enum": [
            "Details",
            "Output",
            "WordDocumentSettings",
            "PdfSettings",
            "DeidentificationSetting",
            "TagsUpdate",
            "SynthesisMetadataUpdate",
            "AllowListUpdate",
            "BlockListUpdate",
            "CustomPiiEntityActivation",
            "ModelBasedEntityActivation",
            "RtfSettings",
            "ConfidenceThresholdUpdate",
            "FormMappingUpdate",
            "PresentationSettings"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DatasetVersionChangeType"
            }
          ]
        },
        "oldValue": {
          "type": "string",
          "description": "Optional previous value for detailed display",
          "x-nullable": true
        },
        "newValue": {
          "type": "string",
          "description": "Optional new value for detailed display",
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "DatasetVersionChangeType": {
      "type": "string",
      "enum": [
        "Details",
        "Output",
        "WordDocumentSettings",
        "PdfSettings",
        "DeidentificationSetting",
        "TagsUpdate",
        "SynthesisMetadataUpdate",
        "AllowListUpdate",
        "BlockListUpdate",
        "CustomPiiEntityActivation",
        "ModelBasedEntityActivation",
        "RtfSettings",
        "ConfidenceThresholdUpdate",
        "FormMappingUpdate",
        "PresentationSettings"
      ]
    },
    "DatasetVersionResponseModel": {
      "type": "object",
      "description": "A single entry in the dataset version history.",
      "properties": {
        "versionNumber": {
          "type": "integer",
          "format": "int32"
        },
        "createdDate": {
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ]
        },
        "user": {
          "description": "A user entity with basic identity information.",
          "allOf": [
            {
              "$ref": "#/definitions/UserEntityModel"
            }
          ],
          "x-nullable": true
        },
        "changeDescription": {
          "type": "string"
        },
        "summary": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/DatasetVersionChangeSummary"
          }
        },
        "restoredFromVersion": {
          "type": "integer",
          "format": "int32",
          "x-nullable": true
        },
        "isLatestVersion": {
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "DatasetVersionResponseModelPaginationResponseModel": {
      "type": "object",
      "description": "Paginated response wrapper containing a page of results along with pagination metadata.",
      "required": [
        "records"
      ],
      "properties": {
        "offset": {
          "type": "integer",
          "description": "The offset from the first item in the results. For example, 20 indicates that this batch of results starts with the 21st result.",
          "format": "int32"
        },
        "limit": {
          "type": "integer",
          "description": "The number of items the request limited the search to. The number of returned items can be less than the limit if not enough items exist or match the filter criteria.",
          "format": "int32"
        },
        "pageNumber": {
          "type": "integer",
          "description": "The number for this page of the results, starting at 1.",
          "format": "int32"
        },
        "totalPages": {
          "type": "integer",
          "description": "The total number of pages in the results.",
          "format": "int32"
        },
        "totalRecords": {
          "type": "integer",
          "description": "The total number of records in the results.",
          "format": "int32"
        },
        "absoluteTotalRecords": {
          "type": "integer",
          "description": "The absolute total number of records available (unfiltered). This represents the total count without any search or filter applied.",
          "format": "int32"
        },
        "hasPreviousPage": {
          "type": "boolean",
          "description": "Whether there is a previous page of results."
        },
        "hasNextPage": {
          "type": "boolean",
          "description": "Whether there is a next page of results."
        },
        "records": {
          "type": "array",
          "description": "An array of returned records.",
          "items": {
            "$ref": "#/definitions/DatasetVersionResponseModel"
          }
        }
      },
      "additionalProperties": false
    },
    "DateSynthesis": {
      "type": "object",
      "description": "Date synthesis model configuration.",
      "properties": {
        "cpuVariant": {
          "type": "string",
          "x-nullable": true
        },
        "modelName": {
          "type": "string",
          "x-nullable": true
        },
        "runsOnGpu": {
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "DeleteSelectedFilesRequest": {
      "type": "object",
      "description": "Request model for deleting a user-selected subset of a dataset's files. Sent as a POST body rather than\na query string because a selection can hold hundreds of file ids, which would exceed URL length limits.",
      "required": [
        "fileIds"
      ],
      "properties": {
        "fileIds": {
          "type": "array",
          "description": "Ids of the dataset files to delete. Ids that do not belong to the dataset are ignored.",
          "minItems": 1,
          "items": {
            "type": "string"
          }
        }
      },
      "additionalProperties": false
    },
    "DocXCommentPolicy": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>Remove</b>: Remove all comments for file</li>\n<li><b>Ignore</b>: Leave comments alone</li>\n</ul>\n",
      "enum": [
        "Remove",
        "Ignore"
      ]
    },
    "DocXImagePolicy": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Run images through OCR and redact sensitive text</li>\n<li><b>Ignore</b>: Leave images alone</li>\n<li><b>Remove</b>: Cover image with opaque black box</li>\n</ul>\n",
      "enum": [
        "Redact",
        "Ignore",
        "Remove"
      ]
    },
    "DocXTablePolicy": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Treat table content normally, feed into redaction process.</li>\n<li><b>Remove</b>: Replace all characters and symbols in table with a placeholder.</li>\n</ul>\n",
      "enum": [
        "Redact",
        "Remove"
      ]
    },
    "DownloadSelectedFilesRequest": {
      "type": "object",
      "description": "Request model for downloading a user-selected subset of a dataset's files as a single ZIP archive.\nSent as a POST body rather than a query string because a selection can hold hundreds of file ids,\nwhich would exceed URL length limits.",
      "required": [
        "fileIds"
      ],
      "properties": {
        "fileIds": {
          "type": "array",
          "description": "Ids of the dataset files to include in the archive. Ids that do not belong to the dataset are ignored.",
          "minItems": 1,
          "items": {
            "type": "string"
          }
        },
        "jsonDownloadAs": {
          "type": "string",
          "description": "Format for JSON file downloads (Json, Markdown, or Html). Ignored by datasets with Original output format.",
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "EditDatasetRequest": {
      "type": "object",
      "description": "Request to update an existing dataset's configuration, redaction policies, and entity settings.",
      "properties": {
        "id": {
          "type": "string",
          "description": "The dataset to edit"
        },
        "name": {
          "type": "string",
          "description": "The new name of the dataset"
        },
        "generatorSetup": {
          "type": "object",
          "description": "A dictionary mapping entity type names to their transformation type (e.g. Redaction, Synthesis, Off).",
          "example": {
            "NAME_GIVEN": "Redaction",
            "NAME_FAMILY": "Redaction"
          },
          "x-nullable": true
        },
        "generatorMetadata": {
          "type": "object",
          "description": "A dictionary mapping entity type names to their transformation metadata configuration.",
          "x-nullable": true
        },
        "labelBlockLists": {
          "type": "object",
          "description": "The new excluded entity value list. Legacy strings inputs are accepted for backward compatibility and normalized into regexes.",
          "example": {
            "NAME_FAMILY": {
              "regexes": [
                ".*\\s(disease|syndrome|disorder)"
              ]
            }
          },
          "x-nullable": true
        },
        "labelAllowLists": {
          "type": "object",
          "description": "The new added entity value list. Legacy strings inputs are accepted for backward compatibility and normalized into regexes.",
          "example": {
            "HEALTHCARE_ID": {
              "regexes": [
                "[a-z]{2}\\d{9}"
              ]
            }
          },
          "x-nullable": true
        },
        "docXImagePolicy": {
          "description": "The new DOCX image policy, options are Redact, Ignore, and Remove",
          "allOf": [
            {
              "$ref": "#/definitions/DocXImagePolicy"
            }
          ],
          "x-nullable": true
        },
        "rtfImagePolicy": {
          "description": "The new RTF image policy, options are Ignore and Remove. Only applicable to JSON datasets.\nOmit to leave the existing dataset value unchanged.",
          "allOf": [
            {
              "$ref": "#/definitions/RtfImagePolicy"
            }
          ],
          "x-nullable": true
        },
        "pdfSignaturePolicy": {
          "description": "The new PDF signature policy.  Options are Redact and Ignore.",
          "allOf": [
            {
              "$ref": "#/definitions/PdfSignaturePolicy"
            }
          ],
          "x-nullable": true
        },
        "pdfSynthModePolicy": {
          "description": "The new PDF and image synthesis mode policy, options are V1 and V5. V2 is accepted for backwards compatibility with existing settings.",
          "allOf": [
            {
              "$ref": "#/definitions/PdfSynthModePolicy"
            }
          ],
          "x-nullable": true
        },
        "docXCommentPolicy": {
          "description": "The new DOCX comment policy, options are Remove and Ignore",
          "allOf": [
            {
              "$ref": "#/definitions/DocXCommentPolicy"
            }
          ],
          "x-nullable": true
        },
        "docXTablePolicy": {
          "description": "The new DOCX table policy, options are Redact and Remove",
          "allOf": [
            {
              "$ref": "#/definitions/DocXTablePolicy"
            }
          ],
          "x-nullable": true
        },
        "pptxImagePolicy": {
          "description": "The new PPTX image policy, options are Redact, Ignore, and Remove. Omit to leave the existing value unchanged.",
          "allOf": [
            {
              "$ref": "#/definitions/PptxImagePolicy"
            }
          ],
          "x-nullable": true
        },
        "pptxCommentPolicy": {
          "description": "The new PPTX comment policy, options are Remove and Ignore. Omit to leave the existing value unchanged.",
          "allOf": [
            {
              "$ref": "#/definitions/PptxCommentPolicy"
            }
          ],
          "x-nullable": true
        },
        "pptxTablePolicy": {
          "description": "The new PPTX table policy, options are Redact and Remove. Omit to leave the existing value unchanged.",
          "allOf": [
            {
              "$ref": "#/definitions/PptxTablePolicy"
            }
          ],
          "x-nullable": true
        },
        "pptxLogoPolicy": {
          "description": "The new PPTX logo policy, options are Ignore and Remove. Remove paints detected logos in slide,\nnotes, layout and master pictures black, regardless of the PPTX image policy. Omit to leave the\nexisting value unchanged.",
          "allOf": [
            {
              "$ref": "#/definitions/PptxLogoPolicy"
            }
          ],
          "x-nullable": true
        },
        "pptxSignaturePolicy": {
          "description": "The new PPTX signature policy, options are Ignore (default) and Remove. Remove paints detected\nsignatures in slide, notes, layout and master pictures black, regardless of the PPTX image policy;\nfor PowerPoint pictures it replaces the PDF signature policy. Omit to leave the existing value\nunchanged.",
          "allOf": [
            {
              "$ref": "#/definitions/PptxSignaturePolicy"
            }
          ],
          "x-nullable": true
        },
        "pptxFacePolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/PptxFacePolicy"
            }
          ],
          "x-nullable": true
        },
        "llmClassificationPolicy": {
          "description": "The LLM classification policy. Enabled reviews detected entities and classifies structured data.\nPdfIdentificationAndSynthesis uses the LLM for PDF PII identification and synthesis.",
          "allOf": [
            {
              "$ref": "#/definitions/LlmClassificationPolicy"
            }
          ],
          "x-nullable": true
        },
        "llmTableClassificationPolicy": {
          "description": "A no longer supported variable, kept only to maintain support for older datasets.",
          "allOf": [
            {
              "$ref": "#/definitions/LlmClassificationPolicy"
            }
          ],
          "x-nullable": true
        },
        "fileSourceExternalCredential": {
          "description": "External credential information",
          "allOf": [
            {
              "$ref": "#/definitions/FileSourceExternalCredentialApiModel"
            }
          ],
          "x-nullable": true
        },
        "outputPath": {
          "type": "string",
          "description": "The Location to store dataset files.  Not applicable to local datasets",
          "x-nullable": true
        },
        "ocrServiceProvider": {
          "description": "OCR engine override (overrides the default OCR engine)",
          "allOf": [
            {
              "$ref": "#/definitions/OcrServiceProvidersEnum"
            }
          ],
          "x-nullable": true
        },
        "formMapping": {
          "description": "Dataset-settings request wrapper for assigning/unassigning an org-level form mapping\n(\"form label mapping\" in the UI). The wrapper exists to distinguish three request states:\nomit the wrapper entirely to leave the dataset's applied mapping unchanged; send the\nwrapper with a null Solar.Core.Models.FormMappingAssignmentRequest.FormMappingId to unassign; send an id to assign\n(the server resolves the mapping and writes a point-in-time clone into\nDataset.FormMappingSetup). Re-sending the currently assigned id refreshes the clone\nto the source's latest version (\"update to latest\").",
          "allOf": [
            {
              "$ref": "#/definitions/FormMappingAssignmentRequest"
            }
          ],
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "EnrichedUserEntityModel": {
      "type": "object",
      "description": "A user entity with extended profile information including organization, photo, and account metadata.",
      "required": [
        "id",
        "userName"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The unique identifier of the user or group."
        },
        "userName": {
          "type": "string",
          "description": "The display name of the user or group.",
          "x-nullable": true
        },
        "firstName": {
          "type": "string",
          "description": "The user's first name.",
          "x-nullable": true
        },
        "lastName": {
          "type": "string",
          "description": "The user's last name.",
          "x-nullable": true
        },
        "organizationId": {
          "type": "string",
          "description": "The identifier of the organization the user belongs to.",
          "x-nullable": true
        },
        "photoMetadata": {
          "description": "Metadata about the user's profile photo, if available.",
          "allOf": [
            {
              "$ref": "#/definitions/UserPhotoModel"
            }
          ],
          "x-nullable": true
        },
        "accountMetadata": {
          "description": "Additional account metadata such as creation date and last activity. Populated only for callers with sufficient privileges.",
          "allOf": [
            {
              "$ref": "#/definitions/UserEntityMetadata"
            }
          ],
          "x-nullable": true
        },
        "teamName": {
          "type": "string",
          "description": "The name of the team the user belongs to, if set.",
          "x-nullable": true
        },
        "deleted": {
          "type": "boolean",
          "description": "Whether the user has been soft-deleted. Only surfaced to callers with permission to manage users."
        }
      },
      "additionalProperties": false
    },
    "EntityGroup": {
      "type": "object",
      "properties": {
        "pii_type": {
          "description": "The type of personally identifiable information detected by Solar.",
          "enum": [
            "NUMERIC_VALUE",
            "LANGUAGE",
            "MONEY",
            "PRODUCT",
            "EVENT",
            "LAW",
            "US_PASSPORT",
            "MEDICAL_LICENSE",
            "DATE_TIME",
            "US_BANK_NUMBER",
            "NRP",
            "US_SSN",
            "IP_ADDRESS",
            "ORGANIZATION",
            "PHONE_NUMBER",
            "US_ITIN",
            "LOCATION",
            "LOCATION_ADDRESS",
            "LOCATION_CITY",
            "LOCATION_STATE",
            "LOCATION_ZIP",
            "LOCATION_COUNTRY",
            "CREDIT_CARD",
            "EMAIL_ADDRESS",
            "IBAN_CODE",
            "URL",
            "NAME_GIVEN",
            "NAME_FAMILY",
            "GENDER_IDENTIFIER",
            "OCCUPATION",
            "PERSON_AGE",
            "DOB",
            "CC_EXP",
            "CVV",
            "MICR_CODE",
            "HEALTHCARE_ID",
            "NUMERIC_PII",
            "LOCATION_COMPLETE_ADDRESS",
            "US_ROUTING_TRANSIT_NUMBER",
            "ACCOUNT_NUMBER",
            "DRIVERS_LICENSE_NUMBER",
            "VEHICLE_ID"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PiiTypeEnum"
            }
          ]
        },
        "entity_indices": {
          "type": "array",
          "items": {
            "type": "integer",
            "format": "int32"
          }
        },
        "representative": {
          "type": "string",
          "x-nullable": true
        },
        "linking_edges": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/EntityLinkingEdgeSdkModel"
          },
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "EntityLinkingEdgeSdkModel": {
      "type": "object",
      "properties": {
        "entityIndexA": {
          "type": "integer",
          "format": "int32"
        },
        "entityIndexB": {
          "type": "integer",
          "format": "int32"
        },
        "linkingConfidence": {
          "type": "number",
          "format": "double"
        },
        "linkingConfidenceType": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "EntityLinkingGroupSdkModel": {
      "type": "object",
      "description": "One entity group used by GroupingSynthesis. Entity indices refer to the\nfiltered entity array returned alongside the groups.",
      "properties": {
        "piiType": {
          "type": "string"
        },
        "entityIndices": {
          "type": "array",
          "items": {
            "type": "integer",
            "format": "int32"
          }
        },
        "representative": {
          "type": "string",
          "x-nullable": true
        },
        "linkingEdges": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/EntityLinkingEdgeSdkModel"
          },
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "EntityLinkingPairScoreSdkModel": {
      "type": "object",
      "description": "Confidence that two entity occurrences refer to the same real-world entity.\nDirect confidence can be below 0.5. Transitive confidence is derived from the\nstrongest path of direct links and is at least 0.5.",
      "properties": {
        "linkingConfidence": {
          "type": "number",
          "format": "double"
        },
        "linkingConfidenceType": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "ExternalFilesResponseModel": {
      "type": "object",
      "description": "The external (cloud) file configuration for a dataset or resource.",
      "properties": {
        "selectedFiles": {
          "type": "array",
          "description": "The list of individual cloud file paths selected for processing.",
          "items": {
            "type": "string"
          }
        },
        "pathPrefixes": {
          "type": "array",
          "description": "The list of cloud path prefixes used to filter files for processing.",
          "items": {
            "type": "string"
          }
        },
        "selectedFileExtensions": {
          "type": "array",
          "description": "The list of file extensions to include when processing cloud files.",
          "items": {
            "type": "string"
          }
        }
      },
      "additionalProperties": false
    },
    "Fasttext": {
      "type": "object",
      "description": "FastText language detection model configuration.",
      "properties": {
        "libVersion": {
          "type": "string"
        },
        "model": {
          "type": "string"
        },
        "runsOnGpu": {
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "FileResponseModel": {
      "type": "object",
      "description": "Details of a file within a dataset, including processing status and word counts.",
      "properties": {
        "fileId": {
          "type": "string",
          "description": "The file ID"
        },
        "fileName": {
          "type": "string",
          "description": "The file name"
        },
        "fileType": {
          "type": "string",
          "description": "The file type, such as csv, txt, pdf, docx"
        },
        "datasetId": {
          "type": "string",
          "description": "The identifier of the dataset that owns the file"
        },
        "numRows": {
          "type": "integer",
          "description": "The number of rows in a csv file.",
          "format": "int64",
          "x-nullable": true
        },
        "numColumns": {
          "type": "integer",
          "description": "The number of columns in a csv file",
          "format": "int32"
        },
        "piiTypes": {
          "type": "array",
          "description": "List of all of the entity types that were detected in the file",
          "items": {
            "type": "string"
          }
        },
        "wordCount": {
          "type": "integer",
          "description": "Total number of words in file",
          "format": "int64"
        },
        "redactedWordCount": {
          "type": "integer",
          "description": "Total number of redacted words in the file",
          "format": "int64"
        },
        "uploadedTimestamp": {
          "description": "The timestamp when the file was uploaded",
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ]
        },
        "fileSource": {
          "description": "The original upload location of source files (Local, S3, Azure, SharePoint, OneLake, or SDK).",
          "enum": [
            "Local",
            "Sharepoint",
            "Aws",
            "Sdk",
            "Azure",
            "OneLake"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/FileSource"
            }
          ]
        },
        "processingStatus": {
          "type": "string",
          "description": "Current status of the file: Queued, Running, Completed, or Failed"
        },
        "processingError": {
          "type": "string",
          "description": "For a file that failed to process, the processing error",
          "x-nullable": true
        },
        "mostRecentCompletedJobId": {
          "type": "string",
          "description": "The identifier of the most recent job that processed the file",
          "x-nullable": true
        },
        "fileParseResultId": {
          "type": "string",
          "description": "The identifier of the file parse result",
          "x-nullable": true
        },
        "filePath": {
          "type": "string",
          "description": "If applicable, the file path of the source file",
          "x-nullable": true
        },
        "generatedFileStatus": {
          "type": "string",
          "description": "Status of the external-file generation job for this file, if applicable",
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "FileSource": {
      "type": "string",
      "description": "The original upload location of source files (Local, S3, Azure, SharePoint, OneLake, or SDK).",
      "enum": [
        "Local",
        "Sharepoint",
        "Aws",
        "Sdk",
        "Azure",
        "OneLake"
      ]
    },
    "FileSourceConfig": {
      "type": "object",
      "properties": {
        "awsS3ServerSideEncryptionType": {
          "allOf": [
            {
              "$ref": "#/definitions/AwsS3SseEncryptionType"
            }
          ],
          "x-nullable": true
        },
        "awsS3ServerSideEncryptionKey": {
          "type": "string",
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "FileSourceExternalCredentialApiModel": {
      "type": "object",
      "description": "Credentials for connecting to an external file source such as S3, Azure Blob Storage, or SharePoint.",
      "properties": {
        "fileSource": {
          "description": "The original upload location of source files (Local, S3, Azure, SharePoint, OneLake, or SDK).",
          "enum": [
            "Local",
            "Sharepoint",
            "Aws",
            "Sdk",
            "Azure",
            "OneLake"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/FileSource"
            }
          ]
        },
        "awsCredentialsSource": {
          "description": "How AWS credentials are being provided, either from user or from environment.  Applicable only to AWS credentials",
          "allOf": [
            {
              "$ref": "#/definitions/AwsCredentialSource"
            }
          ],
          "x-nullable": true
        },
        "credential": {
          "description": "External credential interface for use in serializing credentials to `ExternalDatasetCredentials` table.",
          "allOf": [
            {
              "$ref": "#/definitions/IExternalCredential"
            }
          ],
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "FileTypeEnum": {
      "type": "string",
      "enum": [
        "Csv",
        "Raw",
        "Pdf",
        "DocX",
        "Png",
        "Jpg",
        "Tif",
        "Xlsx",
        "Eml",
        "Msg",
        "M4a",
        "Mp3",
        "Webm",
        "Mp4",
        "Mpga",
        "Wav",
        "Rtf",
        "Json",
        "Html",
        "Zip",
        "Bmp",
        "Wmf",
        "Emf",
        "Pptx",
        "Gif",
        "WebP"
      ]
    },
    "FileVersionToken": {
      "type": "object",
      "description": "Capture state of file undo/redo stack",
      "properties": {
        "sequenceNumber": {
          "type": "integer",
          "description": "Max sequence number across all file history entries",
          "format": "int32"
        },
        "undoDepth": {
          "type": "integer",
          "description": "Count of consecutive undone operations from the top of the stack",
          "format": "int32"
        },
        "historyNonce": {
          "type": "string",
          "description": "Unique identifier of the most recent non-undone history entry, used to detect stale state",
          "x-nullable": true
        },
        "canUndo": {
          "type": "boolean",
          "description": "Indicates whether undo is available (there are non-undone actions in the history)",
          "readOnly": true
        },
        "canRedo": {
          "type": "boolean",
          "description": "Indicates whether redo is available (there are undone actions that can be reapplied)",
          "readOnly": true
        },
        "toToken": {
          "type": "string",
          "readOnly": true
        }
      },
      "additionalProperties": false
    },
    "FormMappingAssignmentRequest": {
      "type": "object",
      "description": "Dataset-settings request wrapper for assigning/unassigning an org-level form mapping\n(\"form label mapping\" in the UI). The wrapper exists to distinguish three request states:\nomit the wrapper entirely to leave the dataset's applied mapping unchanged; send the\nwrapper with a null Solar.Core.Models.FormMappingAssignmentRequest.FormMappingId to unassign; send an id to assign\n(the server resolves the mapping and writes a point-in-time clone into\nDataset.FormMappingSetup). Re-sending the currently assigned id refreshes the clone\nto the source's latest version (\"update to latest\").",
      "required": [
        "formMappingId"
      ],
      "properties": {
        "formMappingId": {
          "type": "string",
          "description": "Id of the org-level form mapping to assign, or null to unassign.",
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "GeneratorEnum": {
      "type": "string",
      "description": "The type of synthetic value generator used to replace detected PII (e.g., Scramble, Email, SSN, CreditCard).",
      "enum": [
        "Scramble",
        "CompanyName",
        "Email",
        "IpAddress",
        "Ssn",
        "Url",
        "Name",
        "HipaaAddressGenerator",
        "DateTime",
        "NumericValue",
        "PhoneNumber",
        "Money",
        "CcExp",
        "Cvv",
        "CreditCard",
        "MicrCode",
        "PersonAge",
        "Swap"
      ]
    },
    "GeneratorVersion": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>V1</b>: Original implementation</li>\n<li><b>V2</b>: Length-aware implementation</li>\n</ul>\n",
      "enum": [
        "V1",
        "V2"
      ]
    },
    "GroupContext": {
      "type": "string",
      "description": "Enum representing the unique context that a Solar.EF.Models.Group belongs to. For example, Organizations may use multiple SSO providers for\nauthentication, and <see cref=\"T:Solar.EF.Models.Group\">Groups</see> are only unique by name within a particular context.",
      "enum": [
        "None",
        "Google",
        "Okta",
        "Azure",
        "OIDC",
        "Keycloak"
      ]
    },
    "GroupEntityModel": {
      "type": "object",
      "description": "A group entity that can be assigned permissions on resources.",
      "required": [
        "context",
        "id",
        "userName"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The unique identifier of the user or group."
        },
        "userName": {
          "type": "string",
          "description": "The display name of the user or group.",
          "x-nullable": true
        },
        "context": {
          "description": "Enum representing the unique context that a Solar.EF.Models.Group belongs to. For example, Organizations may use multiple SSO providers for\nauthentication, and <see cref=\"T:Solar.EF.Models.Group\">Groups</see> are only unique by name within a particular context.",
          "enum": [
            "None",
            "Google",
            "Okta",
            "Azure",
            "OIDC",
            "Keycloak"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/GroupContext"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    "GroupRequest": {
      "type": "object",
      "description": "Request to group detected entities using entity linking.",
      "properties": {
        "entities": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/NerEntity"
          }
        },
        "original_text": {
          "type": "string"
        },
        "include_entity_linking_scores": {
          "type": "boolean",
          "description": "Include entity-linking confidence scores. The default value is False."
        },
        "entity_linking_score_limit": {
          "type": "integer",
          "description": "Maximum number of entity-linking scores to return. Set to null for no limit.",
          "format": "int32",
          "maximum": 2147483647,
          "minimum": 1,
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "GroupResponse": {
      "type": "object",
      "description": "Response containing entity groups produced by entity linking.",
      "properties": {
        "entities": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/NerEntity"
          }
        },
        "groups": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/EntityGroup"
          }
        },
        "entity_linking_score_matrix": {
          "type": "array",
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/definitions/EntityLinkingPairScoreSdkModel"
            }
          },
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "GroupSynthesisRequest": {
      "type": "object",
      "properties": {
        "entities": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/NerEntity"
          }
        },
        "original_text": {
          "type": "string"
        },
        "generator_setup": {
          "type": "object",
          "description": "A dictionary mapping entity type names to their transformation type (e.g. Redaction, Synthesis, Off).",
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "GroupSynthesisResponse": {
      "type": "object",
      "properties": {
        "redacted_text": {
          "type": "string"
        },
        "replacements": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Replacement"
          }
        }
      },
      "additionalProperties": false
    },
    "HtmlRedactionRequest": {
      "type": "object",
      "description": "Request to redact PII from an HTML document.",
      "properties": {
        "generatorConfig": {
          "type": "object",
          "description": "A dictionary of entity types to their transformation type.",
          "example": {
            "NAME_GIVEN": "Redaction",
            "NAME_FAMILY": "Redaction"
          }
        },
        "generatorDefault": {
          "description": "The default type of transformation to apply to each entity.<p>Possible values:</p>\n<ul>\n<li><b>Off</b>: Ignore the PII type</li>\n<li><b>Synthesis</b>: Synthesize a new, realistic entity</li>\n<li><b>Redaction</b>: Tokenize the entity, e.g. [NAME_GIVEN_ssys5]</li>\n<li><b>GroupingSynthesis</b>: Synthesize entities using consistent grouping across the document</li>\n<li><b>ReplacementSynthesis</b>: Replace entities with LLM generated values. ReplacementSynthesis is no longer used</li>\n</ul>\n",
          "enum": [
            "Off",
            "Synthesis",
            "Redaction",
            "GroupingSynthesis",
            "ReplacementSynthesis"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PiiTypeGeneratorStateEnum"
            }
          ],
          "example": "Off"
        },
        "docXImagePolicy": {
          "description": "Policy for handling DocX Images<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Run images through OCR and redact sensitive text</li>\n<li><b>Ignore</b>: Leave images alone</li>\n<li><b>Remove</b>: Cover image with opaque black box</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXImagePolicy"
            }
          ]
        },
        "rtfImagePolicy": {
          "description": "Policy for handling images in RTF files (JSON datasets only)<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave images alone</li>\n<li><b>Remove</b>: Replace each image with an opaque black box of the same size</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/RtfImagePolicy"
            }
          ]
        },
        "docXCommentPolicy": {
          "description": "Policy for handling DocX comments<p>Possible values:</p>\n<ul>\n<li><b>Remove</b>: Remove all comments for file</li>\n<li><b>Ignore</b>: Leave comments alone</li>\n</ul>\n",
          "enum": [
            "Remove",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXCommentPolicy"
            }
          ]
        },
        "pdfSignaturePolicy": {
          "description": "Policy for handling PDF signatures<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Cover signature with opaque black box</li>\n<li><b>Ignore</b>: Do not attempt to detect signature</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PdfSignaturePolicy"
            }
          ]
        },
        "pdfSynthModePolicy": {
          "description": "Policy for handling PDF and image synthesis mode<p>Possible values:</p>\n<ul>\n<li><b>V1</b>: Original mode with incorrect font, size and style</li>\n<li><b>V2</b>: Legacy style-aware mode. Persisted V2 values now use the V5 font detector.</li>\n<li><b>V5</b>: Style-aware mode backed by the V5 OpenVINO font model</li>\n</ul>\n",
          "enum": [
            "V1",
            "V2",
            "V5"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PdfSynthModePolicy"
            }
          ]
        },
        "docXTablePolicy": {
          "description": "Policy for handling tables in Word Documents<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Treat table content normally, feed into redaction process.</li>\n<li><b>Remove</b>: Replace all characters and symbols in table with a placeholder.</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXTablePolicy"
            }
          ]
        },
        "pptxImagePolicy": {
          "description": "Policy for handling pictures in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Run pictures embedded in slides and speaker notes through OCR and redact sensitive text</li>\n<li><b>Ignore</b>: Leave pictures alone</li>\n<li><b>Remove</b>: Replace each picture with an opaque black box of the same size</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxImagePolicy"
            }
          ]
        },
        "pptxCommentPolicy": {
          "description": "Policy for handling comments in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Remove</b>: Remove all comments (and comment authors) from the presentation</li>\n<li><b>Ignore</b>: Leave comments alone</li>\n</ul>\n",
          "enum": [
            "Remove",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxCommentPolicy"
            }
          ]
        },
        "pptxTablePolicy": {
          "description": "Policy for handling tables in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Treat table content normally, feed into redaction process.</li>\n<li><b>Remove</b>: Replace all characters and symbols in table cells with a placeholder.</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxTablePolicy"
            }
          ]
        },
        "pptxLogoPolicy": {
          "description": "Policy for detected logos in PowerPoint pictures: Ignore (default) or Remove (paint black)<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected logos in pictures alone</li>\n<li><b>Remove</b>: Paint detected logos in slide, notes, layout and master pictures black, regardless of the image policy.</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxLogoPolicy"
            }
          ]
        },
        "pptxSignaturePolicy": {
          "description": "Policy for detected signatures in PowerPoint pictures: Ignore (default) or Remove (paint black). Replaces the PDF signature policy for PowerPoint pictures.<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected signatures in pictures alone. The default: a deck's pictures are mostly icons, charts and photos, which the detector confuses with signatures, and a slide rarely carries a real one.</li>\n<li><b>Remove</b>: Paint detected signatures in slide, notes, layout and master pictures black, regardless of the image policy. For pictures hosted by a presentation this replaces</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxSignaturePolicy"
            }
          ]
        },
        "pptxFacePolicy": {
          "description": "Policy for detected faces in PowerPoint pictures: Ignore (default) or Remove (paint black). Independent of the PowerPoint image policy.<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected faces in pictures alone. The default.</li>\n<li><b>Remove</b>: Paint detected faces in slide, notes, layout and master pictures black, regardless of the image policy.</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxFacePolicy"
            }
          ]
        },
        "llmClassificationPolicy": {
          "description": "Controls LLM use for entity processing. Enabled reviews detected entities. PdfIdentificationAndSynthesis uses the LLM for dataset PDF PII identification and synthesis. Both modes add latency and require an LLM to be configured on the instance.<p>Possible values:</p>\n<ul>\n<li><b>Disabled</b>: Do not use LLM for structured data classification</li>\n<li><b>Enabled</b>: Use LLM to classify structured data for PII detection</li>\n<li><b>PdfIdentificationAndSynthesis</b>: Use an LLM instead of the NER model and C# generators for PDF PII identification and synthesis. Other file types continue to use their existing detection and synthesis paths.</li>\n</ul>\n",
          "enum": [
            "Disabled",
            "Enabled",
            "PdfIdentificationAndSynthesis"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/LlmClassificationPolicy"
            }
          ]
        },
        "llmTableClassificationPolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/LlmClassificationPolicy"
            }
          ],
          "x-nullable": true
        },
        "labelBlockLists": {
          "type": "object",
          "description": "A list of regexes to match against the specified entity type for exclusion. Legacy strings inputs are accepted and normalized into regexes.",
          "example": {
            "NAME_FAMILY": {
              "regexes": [
                ".*\\s(disease|syndrom|disorder)"
              ]
            }
          }
        },
        "labelAllowLists": {
          "type": "object",
          "description": "A list of regexes to match against the specified entity type for inclusion. Legacy strings inputs are accepted and normalized into regexes.",
          "example": {
            "HEALTHCARE_ID": {
              "regexes": [
                "[a-z]{2}\\d{9}"
              ]
            }
          }
        },
        "generatorMetadata": {
          "type": "object",
          "description": "A dictionary mapping entity type names to their transformation metadata configuration."
        },
        "recordApiRequestOptions": {
          "description": "Options for recording an API request for audit review, including tagging.",
          "allOf": [
            {
              "$ref": "#/definitions/RecordApiRequestOptions"
            }
          ],
          "x-nullable": true
        },
        "customPiiEntityIds": {
          "type": "array",
          "description": "A list of custom Pii Entity names to use for NER",
          "items": {
            "type": "string"
          },
          "x-nullable": true
        },
        "customEntityRankingModes": {
          "type": "object",
          "description": "Optional per-entity ranking overrides for custom-PII and model-based entities detected in\nthis request. Keys are entity Names (the same identifiers used in Solar.Core.Models.BaseApiRedactionRequest.CustomPiiEntityIds);\nvalues control whether the custom entity always wins an exact-boundary overlap against a\nbuilt-in entity (`Prioritized`) or is compared by score (`Standard`). Omit to keep\ntoday's behavior of treating every requested custom entity as Prioritized. Supplying a key\nthat does not match any requested custom-PII or model-based entity Name is rejected as a\n400 error.",
          "example": {
            "MY_CUSTOM_ENTITY": "Standard"
          },
          "x-nullable": true
        },
        "customEntityConfidenceThresholds": {
          "type": "object",
          "description": "Optional per-entity minimum detection confidence thresholds for custom-PII and model-based\nentities detected in this request. Keys are entity Names (the same identifiers used in\nSolar.Core.Models.BaseApiRedactionRequest.CustomPiiEntityIds); each value is in (0, 1], and detections for that entity\nwhose score falls below it are ignored. Omit to keep today's behavior of no confidence\ncutoff. Supplying a key that does not match any requested custom-PII or model-based entity\nName, or a value outside (0, 1], is rejected as a 400 error.",
          "additionalProperties": {
            "type": "number",
            "format": "double"
          },
          "example": {
            "MY_CUSTOM_ENTITY": 0.5
          },
          "x-nullable": true
        },
        "htmlText": {
          "type": "string",
          "description": "The HTML document redact",
          "example": "\n            <!DOCTYPE html>\n            <html>\n            <body>\n            <h1>Account Information</h1>\n            <p>Account Holder: John Smith</p>\n            </body>\n            </html>\n            "
        }
      },
      "additionalProperties": false
    },
    "IExternalCredential": {
      "type": "object",
      "description": "External credential interface for use in serializing credentials to `ExternalDatasetCredentials` table.",
      "additionalProperties": false
    },
    "Image": {
      "type": "object",
      "description": "Image processing model version information.",
      "properties": {
        "version": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "ImportDatasetSettingsOptions": {
      "type": "object",
      "required": [
        "fromDatasetId"
      ],
      "properties": {
        "fromDatasetId": {
          "type": "string"
        },
        "importProjectSettings": {
          "type": "boolean"
        },
        "importEntitySettings": {
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "Instant": {
      "type": "object",
      "description": "A point in time represented as an ISO 8601 timestamp string.",
      "additionalProperties": false
    },
    "JobModel": {
      "type": "object",
      "description": "Represents a background processing job with status, timing, and resource association details.",
      "properties": {
        "id": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "errorMessages": {
          "type": "string",
          "x-nullable": true
        },
        "startTime": {
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ],
          "x-nullable": true
        },
        "endTime": {
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ],
          "x-nullable": true
        },
        "publishedTime": {
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ]
        },
        "datasetFileId": {
          "type": "string",
          "x-nullable": true
        },
        "datasetId": {
          "type": "string",
          "x-nullable": true
        },
        "jobType": {
          "description": "The type of background processing job (e.g., file deidentification, transcription, or model training).",
          "enum": [
            "DeidentifyFile",
            "ModelTemplateGeneration",
            "ModelTraining",
            "DeidentifyUnattachedFile",
            "ParseFiles",
            "PipelineDeidentifyFile",
            "ParseFileFromSdk",
            "AudioTranscription",
            "ProcessExternalFiles",
            "GenerateExternalFiles",
            "ManualRedactionProcessFile",
            "FileAnnotation",
            "GenerateNewGuidelines",
            "TrainingFileAnalysis",
            "TrainingFileAnnotation",
            "AuditRedactRequest",
            "HarvestFormMappingFile",
            "ApplyFormMapping"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/JobType"
            }
          ]
        },
        "ocrServiceProvider": {
          "allOf": [
            {
              "$ref": "#/definitions/OcrServiceProvidersEnum"
            }
          ],
          "x-nullable": true
        },
        "modelsInfo": {
          "description": "Information about the ML models and libraries used during processing.",
          "allOf": [
            {
              "$ref": "#/definitions/ModelsInfo"
            }
          ]
        },
        "pdfSynthModePolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/PdfSynthModePolicy"
            }
          ],
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "JobType": {
      "type": "string",
      "description": "The type of background processing job (e.g., file deidentification, transcription, or model training).",
      "enum": [
        "DeidentifyFile",
        "ModelTemplateGeneration",
        "ModelTraining",
        "DeidentifyUnattachedFile",
        "ParseFiles",
        "PipelineDeidentifyFile",
        "ParseFileFromSdk",
        "AudioTranscription",
        "ProcessExternalFiles",
        "GenerateExternalFiles",
        "ManualRedactionProcessFile",
        "FileAnnotation",
        "GenerateNewGuidelines",
        "TrainingFileAnalysis",
        "TrainingFileAnnotation",
        "AuditRedactRequest",
        "HarvestFormMappingFile",
        "ApplyFormMapping"
      ]
    },
    "JsonRedactionRequest": {
      "type": "object",
      "description": "Request to redact PII from a JSON document.",
      "required": [
        "jsonText"
      ],
      "properties": {
        "generatorConfig": {
          "type": "object",
          "description": "A dictionary of entity types to their transformation type.",
          "example": {
            "NAME_GIVEN": "Redaction",
            "NAME_FAMILY": "Redaction"
          }
        },
        "generatorDefault": {
          "description": "The default type of transformation to apply to each entity.<p>Possible values:</p>\n<ul>\n<li><b>Off</b>: Ignore the PII type</li>\n<li><b>Synthesis</b>: Synthesize a new, realistic entity</li>\n<li><b>Redaction</b>: Tokenize the entity, e.g. [NAME_GIVEN_ssys5]</li>\n<li><b>GroupingSynthesis</b>: Synthesize entities using consistent grouping across the document</li>\n<li><b>ReplacementSynthesis</b>: Replace entities with LLM generated values. ReplacementSynthesis is no longer used</li>\n</ul>\n",
          "enum": [
            "Off",
            "Synthesis",
            "Redaction",
            "GroupingSynthesis",
            "ReplacementSynthesis"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PiiTypeGeneratorStateEnum"
            }
          ],
          "example": "Off"
        },
        "docXImagePolicy": {
          "description": "Policy for handling DocX Images<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Run images through OCR and redact sensitive text</li>\n<li><b>Ignore</b>: Leave images alone</li>\n<li><b>Remove</b>: Cover image with opaque black box</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXImagePolicy"
            }
          ]
        },
        "rtfImagePolicy": {
          "description": "Policy for handling images in RTF files (JSON datasets only)<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave images alone</li>\n<li><b>Remove</b>: Replace each image with an opaque black box of the same size</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/RtfImagePolicy"
            }
          ]
        },
        "docXCommentPolicy": {
          "description": "Policy for handling DocX comments<p>Possible values:</p>\n<ul>\n<li><b>Remove</b>: Remove all comments for file</li>\n<li><b>Ignore</b>: Leave comments alone</li>\n</ul>\n",
          "enum": [
            "Remove",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXCommentPolicy"
            }
          ]
        },
        "pdfSignaturePolicy": {
          "description": "Policy for handling PDF signatures<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Cover signature with opaque black box</li>\n<li><b>Ignore</b>: Do not attempt to detect signature</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PdfSignaturePolicy"
            }
          ]
        },
        "pdfSynthModePolicy": {
          "description": "Policy for handling PDF and image synthesis mode<p>Possible values:</p>\n<ul>\n<li><b>V1</b>: Original mode with incorrect font, size and style</li>\n<li><b>V2</b>: Legacy style-aware mode. Persisted V2 values now use the V5 font detector.</li>\n<li><b>V5</b>: Style-aware mode backed by the V5 OpenVINO font model</li>\n</ul>\n",
          "enum": [
            "V1",
            "V2",
            "V5"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PdfSynthModePolicy"
            }
          ]
        },
        "docXTablePolicy": {
          "description": "Policy for handling tables in Word Documents<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Treat table content normally, feed into redaction process.</li>\n<li><b>Remove</b>: Replace all characters and symbols in table with a placeholder.</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXTablePolicy"
            }
          ]
        },
        "pptxImagePolicy": {
          "description": "Policy for handling pictures in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Run pictures embedded in slides and speaker notes through OCR and redact sensitive text</li>\n<li><b>Ignore</b>: Leave pictures alone</li>\n<li><b>Remove</b>: Replace each picture with an opaque black box of the same size</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxImagePolicy"
            }
          ]
        },
        "pptxCommentPolicy": {
          "description": "Policy for handling comments in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Remove</b>: Remove all comments (and comment authors) from the presentation</li>\n<li><b>Ignore</b>: Leave comments alone</li>\n</ul>\n",
          "enum": [
            "Remove",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxCommentPolicy"
            }
          ]
        },
        "pptxTablePolicy": {
          "description": "Policy for handling tables in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Treat table content normally, feed into redaction process.</li>\n<li><b>Remove</b>: Replace all characters and symbols in table cells with a placeholder.</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxTablePolicy"
            }
          ]
        },
        "pptxLogoPolicy": {
          "description": "Policy for detected logos in PowerPoint pictures: Ignore (default) or Remove (paint black)<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected logos in pictures alone</li>\n<li><b>Remove</b>: Paint detected logos in slide, notes, layout and master pictures black, regardless of the image policy.</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxLogoPolicy"
            }
          ]
        },
        "pptxSignaturePolicy": {
          "description": "Policy for detected signatures in PowerPoint pictures: Ignore (default) or Remove (paint black). Replaces the PDF signature policy for PowerPoint pictures.<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected signatures in pictures alone. The default: a deck's pictures are mostly icons, charts and photos, which the detector confuses with signatures, and a slide rarely carries a real one.</li>\n<li><b>Remove</b>: Paint detected signatures in slide, notes, layout and master pictures black, regardless of the image policy. For pictures hosted by a presentation this replaces</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxSignaturePolicy"
            }
          ]
        },
        "pptxFacePolicy": {
          "description": "Policy for detected faces in PowerPoint pictures: Ignore (default) or Remove (paint black). Independent of the PowerPoint image policy.<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected faces in pictures alone. The default.</li>\n<li><b>Remove</b>: Paint detected faces in slide, notes, layout and master pictures black, regardless of the image policy.</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxFacePolicy"
            }
          ]
        },
        "llmClassificationPolicy": {
          "description": "Controls LLM use for entity processing. Enabled reviews detected entities. PdfIdentificationAndSynthesis uses the LLM for dataset PDF PII identification and synthesis. Both modes add latency and require an LLM to be configured on the instance.<p>Possible values:</p>\n<ul>\n<li><b>Disabled</b>: Do not use LLM for structured data classification</li>\n<li><b>Enabled</b>: Use LLM to classify structured data for PII detection</li>\n<li><b>PdfIdentificationAndSynthesis</b>: Use an LLM instead of the NER model and C# generators for PDF PII identification and synthesis. Other file types continue to use their existing detection and synthesis paths.</li>\n</ul>\n",
          "enum": [
            "Disabled",
            "Enabled",
            "PdfIdentificationAndSynthesis"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/LlmClassificationPolicy"
            }
          ]
        },
        "llmTableClassificationPolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/LlmClassificationPolicy"
            }
          ],
          "x-nullable": true
        },
        "labelBlockLists": {
          "type": "object",
          "description": "A list of regexes to match against the specified entity type for exclusion. Legacy strings inputs are accepted and normalized into regexes.",
          "example": {
            "NAME_FAMILY": {
              "regexes": [
                ".*\\s(disease|syndrom|disorder)"
              ]
            }
          }
        },
        "labelAllowLists": {
          "type": "object",
          "description": "A list of regexes to match against the specified entity type for inclusion. Legacy strings inputs are accepted and normalized into regexes.",
          "example": {
            "HEALTHCARE_ID": {
              "regexes": [
                "[a-z]{2}\\d{9}"
              ]
            }
          }
        },
        "generatorMetadata": {
          "type": "object",
          "description": "A dictionary mapping entity type names to their transformation metadata configuration."
        },
        "recordApiRequestOptions": {
          "description": "Options for recording an API request for audit review, including tagging.",
          "allOf": [
            {
              "$ref": "#/definitions/RecordApiRequestOptions"
            }
          ],
          "x-nullable": true
        },
        "customPiiEntityIds": {
          "type": "array",
          "description": "A list of custom Pii Entity names to use for NER",
          "items": {
            "type": "string"
          },
          "x-nullable": true
        },
        "customEntityRankingModes": {
          "type": "object",
          "description": "Optional per-entity ranking overrides for custom-PII and model-based entities detected in\nthis request. Keys are entity Names (the same identifiers used in Solar.Core.Models.BaseApiRedactionRequest.CustomPiiEntityIds);\nvalues control whether the custom entity always wins an exact-boundary overlap against a\nbuilt-in entity (`Prioritized`) or is compared by score (`Standard`). Omit to keep\ntoday's behavior of treating every requested custom entity as Prioritized. Supplying a key\nthat does not match any requested custom-PII or model-based entity Name is rejected as a\n400 error.",
          "example": {
            "MY_CUSTOM_ENTITY": "Standard"
          },
          "x-nullable": true
        },
        "customEntityConfidenceThresholds": {
          "type": "object",
          "description": "Optional per-entity minimum detection confidence thresholds for custom-PII and model-based\nentities detected in this request. Keys are entity Names (the same identifiers used in\nSolar.Core.Models.BaseApiRedactionRequest.CustomPiiEntityIds); each value is in (0, 1], and detections for that entity\nwhose score falls below it are ignored. Omit to keep today's behavior of no confidence\ncutoff. Supplying a key that does not match any requested custom-PII or model-based entity\nName, or a value outside (0, 1], is rejected as a 400 error.",
          "additionalProperties": {
            "type": "number",
            "format": "double"
          },
          "example": {
            "MY_CUSTOM_ENTITY": 0.5
          },
          "x-nullable": true
        },
        "jsonText": {
          "type": "string",
          "description": "The JSON body to redact",
          "minLength": 1,
          "example": "{\"Name\": \"John Smith\", \"Description\": \"John lives in Atlanta, Ga.\"}"
        },
        "jsonPathAllowLists": {
          "type": "object",
          "description": "Optional mapping of JSON paths to entity labels",
          "example": {
            "NAME_GIVEN": [
              "$.name.first"
            ]
          }
        },
        "jsonPathIgnorePaths": {
          "type": "array",
          "description": "Optional array of JSONPath expressions for values that should not be redacted. Any JSON element matching these paths will be left unchanged in the output.",
          "items": {
            "type": "string"
          },
          "example": [
            "$.id",
            "$.metadata.timestamp"
          ],
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "LabelCustomList": {
      "type": "object",
      "description": "A collection of regex patterns used to match entity values for inclusion or exclusion. Legacy strings are accepted on input and normalized into regexes.",
      "properties": {
        "regexes": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "LlmClassificationPolicy": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>Disabled</b>: Do not use LLM for structured data classification</li>\n<li><b>Enabled</b>: Use LLM to classify structured data for PII detection</li>\n<li><b>PdfIdentificationAndSynthesis</b>: Use an LLM instead of the NER model and C# generators for PDF PII identification and synthesis. Other file types continue to use their existing detection and synthesis paths.</li>\n</ul>\n",
      "enum": [
        "Disabled",
        "Enabled",
        "PdfIdentificationAndSynthesis"
      ]
    },
    "LocalFileUploadRequestModel": {
      "type": "object",
      "description": "Model for uploading a local file.",
      "required": [
        "csvConfig",
        "datasetId",
        "fileName"
      ],
      "properties": {
        "fileName": {
          "type": "string",
          "description": "The name of the file to upload.",
          "example": "example.txt"
        },
        "csvConfig": {
          "description": "Configuration for parsing the CSV file.",
          "allOf": [
            {
              "$ref": "#/definitions/SolarCsvConfig"
            }
          ]
        },
        "datasetId": {
          "type": "string",
          "description": "The ID of the dataset to which the file belongs.",
          "example": "6a01360f-78fc-9f2f-efae-c5e1461e9c1et"
        },
        "customPiiEntityIds": {
          "type": "array",
          "description": "Optional list of custom entity identifiers. An entity identifier is the name of the custom entity in all caps, prefixed with CUSTOM_, and with spaces replaced by underscores.",
          "items": {
            "type": "string"
          },
          "example": [
            "CUSTOM_ENTITY_1",
            "CUSTOM_ENTITY_2"
          ],
          "x-nullable": true
        },
        "labelAllowLists": {
          "type": "object",
          "description": "Optional per-entity allow lists of regex patterns used during detection. Legacy strings inputs are accepted and normalized into regexes."
        },
        "labelBlockLists": {
          "type": "object",
          "description": "Optional per-entity block lists of regex patterns used during detection. Legacy strings inputs are accepted and normalized into regexes."
        }
      },
      "additionalProperties": false
    },
    "ManualRedactionOutputFormatEnum": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>ReferenceCodes</b>: Each entity is replaced with a custom label, specified by user. When not specified, we use the entity label</li>\n<li><b>NoIdentifiers</b>: Each entity is fully redacted with no replacement text</li>\n</ul>\n",
      "enum": [
        "ReferenceCodes",
        "NoIdentifiers"
      ]
    },
    "ManualRedactionOutputOptions": {
      "type": "object",
      "description": "Output options for the generated PDF generated via a guided redaction, controlling reference codes, watermarks, and page numbers.",
      "properties": {
        "pdfReferenceCodeWorkflowMode": {
          "description": "How reference codes are applied during redaction<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Redact mode: Replace text with a filled box containing reference codes inside. The redacted text is completely hidden and replaced with a solid black or white box that displays the reference codes as centered text inside the box. This is the default mode for final deliverables where sensitive data must be completely hidden.</li>\n<li><b>Review</b>: Review mode: Keep original text visible with a red border and reference codes as annotations. The original text remains visible inside a red outlined border (no fill), and reference codes are placed on top of the border as annotation-style labels (similar to reviewer initials or markup). This mode is intended for internal review and quality assurance where reviewers need to verify the original text.</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Review"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PdfReferenceCodeWorkflowMode"
            }
          ]
        },
        "pdfReferenceCodeDisplayMode": {
          "description": "Visual style of reference codes on the redacted PDF<p>Possible values:</p>\n<ul>\n<li><b>BlackBoxWhiteText</b>: Black box with white text. Redacted areas appear as black boxes with reference codes displayed in white text. This is the default mode and provides high contrast for readability.</li>\n<li><b>WhiteBoxBlackText</b>: White box with black text. Redacted areas appear as white boxes with reference codes displayed in black text. This mode provides a cleaner appearance similar to text highlighting.</li>\n</ul>\n",
          "enum": [
            "BlackBoxWhiteText",
            "WhiteBoxBlackText"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PdfReferenceCodeDisplayMode"
            }
          ]
        },
        "includeReferenceCodes": {
          "type": "boolean",
          "description": "Whether to include reference codes on the redacted PDF"
        },
        "watermarkText": {
          "type": "string",
          "description": "Optional watermark text to overlay on each page",
          "maxLength": 30,
          "x-nullable": true
        },
        "footerText": {
          "type": "string",
          "description": "Optional footer text to stamp on the bottom-left corner of each page",
          "maxLength": 50,
          "x-nullable": true
        },
        "includePageNumbers": {
          "type": "boolean",
          "description": "Whether to include page numbers on the redacted PDF"
        },
        "mergeIntoSinglePdf": {
          "type": "boolean",
          "description": "Whether to merge all project files into a single PDF instead of a ZIP archive"
        }
      },
      "additionalProperties": false
    },
    "ManualRedactionProjectFileResponseModel": {
      "type": "object",
      "description": "Details of a file within a guided redaction project, including processing status, entity counts, and review state.",
      "properties": {
        "id": {
          "type": "string"
        },
        "fileName": {
          "type": "string"
        },
        "fileType": {
          "type": "string"
        },
        "projectId": {
          "type": "string"
        },
        "numRows": {
          "type": "integer",
          "format": "int64",
          "x-nullable": true
        },
        "numColumns": {
          "type": "integer",
          "format": "int32"
        },
        "piiTypes": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "wordCount": {
          "type": "integer",
          "format": "int64"
        },
        "redactedWordCount": {
          "type": "integer",
          "format": "int64"
        },
        "uploadedTimestamp": {
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ]
        },
        "fileSource": {
          "description": "The original upload location of source files (Local, S3, Azure, SharePoint, OneLake, or SDK).",
          "enum": [
            "Local",
            "Sharepoint",
            "Aws",
            "Sdk",
            "Azure",
            "OneLake"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/FileSource"
            }
          ]
        },
        "processingStatus": {
          "type": "string"
        },
        "processingError": {
          "type": "string",
          "x-nullable": true
        },
        "mostRecentCompletedJobId": {
          "type": "string",
          "x-nullable": true
        },
        "filePath": {
          "type": "string",
          "x-nullable": true
        },
        "reviewStatus": {
          "description": "Review status for a guided redaction project or file, including display label and color.",
          "allOf": [
            {
              "$ref": "#/definitions/ManualRedactionStatusResponseModel"
            }
          ]
        },
        "labelAllowLists": {
          "type": "object"
        },
        "labelBlockLists": {
          "type": "object"
        },
        "generatorSetup": {
          "type": "object"
        },
        "customPiiEntityNames": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "fileVersionToken": {
          "description": "Capture state of file undo/redo stack",
          "allOf": [
            {
              "$ref": "#/definitions/FileVersionToken"
            }
          ]
        },
        "skipBulkRedactionConfirmation": {
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "ManualRedactionProjectOperation": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>HasAccess</b>: Ability to access a project. Every Project Permission Set has this operation.</li>\n<li><b>ViewSettings</b>: View settings</li>\n<li><b>EditSettings</b>: Edit settings</li>\n<li><b>Share</b>: Share project access</li>\n<li><b>Delete</b>: Delete a project</li>\n<li><b>UploadFiles</b>: Upload files to project</li>\n<li><b>DownloadFiles</b>: Download project files</li>\n<li><b>DeleteFiles</b>: Delete project files</li>\n<li><b>EditFileRedactions</b>: Edit file redactions</li>\n<li><b>PreviewFiles</b>: Preview file contents</li>\n<li><b>ManageComments</b>: Add, resolve, or remove comments on documents or selected text for collaborative review</li>\n<li><b>ReviewRedactions</b>: View documents in review mode and approve redactions before they are finalized</li>\n<li><b>ViewAuditLog</b>: Access a detailed history of actions taken within the project for compliance and tracking purposes</li>\n</ul>\n",
      "enum": [
        "HasAccess",
        "ViewSettings",
        "EditSettings",
        "Share",
        "Delete",
        "UploadFiles",
        "DownloadFiles",
        "DeleteFiles",
        "EditFileRedactions",
        "PreviewFiles",
        "ManageComments",
        "ReviewRedactions",
        "ViewAuditLog"
      ]
    },
    "ManualRedactionProjectResponseModel": {
      "type": "object",
      "description": "Full guided redaction project details, including files, configuration, status, and permission information.",
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "generatorSetup": {
          "type": "object",
          "example": "{\"NAME_GIVEN\":\"Redaction\", \"NAME_FAMILY\":\"Redaction\"}",
          "x-nullable": true
        },
        "labelBlockLists": {
          "type": "object",
          "example": "{\"NAME_FAMILY\":{\"regexes\":[\".*\\\\s(disease|syndrom|disorder)\"]}}",
          "x-nullable": true
        },
        "labelAllowLists": {
          "type": "object",
          "example": "{\"HEALTHCARE_ID\":{\"regexes\":[\"[a-z]{2}\\\\d{9}\"]}}",
          "x-nullable": true
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "files": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/ManualRedactionProjectFileResponseModel"
          },
          "x-nullable": true
        },
        "lastUpdated": {
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ]
        },
        "created": {
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ]
        },
        "creatorUser": {
          "description": "A user entity with basic identity information.",
          "allOf": [
            {
              "$ref": "#/definitions/UserEntityModel"
            }
          ],
          "x-nullable": true
        },
        "fileSource": {
          "allOf": [
            {
              "$ref": "#/definitions/FileSource"
            }
          ],
          "x-nullable": true
        },
        "customPiiEntityIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "x-nullable": true
        },
        "operations": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/ManualRedactionProjectOperation"
          },
          "x-nullable": true
        },
        "fileSourceExternalCredential": {
          "description": "Credentials for connecting to an external file source such as S3, Azure Blob Storage, or SharePoint.",
          "allOf": [
            {
              "$ref": "#/definitions/FileSourceExternalCredentialApiModel"
            }
          ],
          "x-nullable": true
        },
        "awsCredentialSource": {
          "type": "string",
          "x-nullable": true
        },
        "status": {
          "description": "Review status for a guided redaction project or file, including display label and color.",
          "allOf": [
            {
              "$ref": "#/definitions/ManualRedactionStatusResponseModel"
            }
          ]
        },
        "redactionOutputFormat": {
          "allOf": [
            {
              "$ref": "#/definitions/ManualRedactionOutputFormatEnum"
            }
          ],
          "x-nullable": true
        },
        "description": {
          "type": "string",
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "ManualRedactionStatusResponseModel": {
      "type": "object",
      "description": "Review status for a guided redaction project or file, including display label and color.",
      "properties": {
        "id": {
          "type": "string"
        },
        "label": {
          "type": "string"
        },
        "colorHexCode": {
          "type": "string"
        },
        "order": {
          "type": "integer",
          "format": "int32"
        },
        "canDelete": {
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "MinimalDatasetResponseModel": {
      "type": "object",
      "description": "Lightweight dataset summary containing only core metadata used in list views and search results.",
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "fileSource": {
          "allOf": [
            {
              "$ref": "#/definitions/FileSource"
            }
          ],
          "x-nullable": true
        },
        "operations": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/DatasetOperation"
          }
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "lastUpdated": {
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ]
        },
        "created": {
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ]
        },
        "creatorUser": {
          "description": "A user entity with basic identity information.",
          "allOf": [
            {
              "$ref": "#/definitions/UserEntityModel"
            }
          ],
          "x-nullable": true
        },
        "fileCount": {
          "type": "integer",
          "format": "int32"
        },
        "formMappingName": {
          "type": "string",
          "x-nullable": true
        },
        "formMappingStatus": {
          "allOf": [
            {
              "$ref": "#/definitions/DatasetFormMappingStatus"
            }
          ],
          "x-nullable": true
        },
        "formMappingNoticeDismissed": {
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "MinimalDatasetResponseModelPaginationResponseModel": {
      "type": "object",
      "description": "Paginated response wrapper containing a page of results along with pagination metadata.",
      "required": [
        "records"
      ],
      "properties": {
        "offset": {
          "type": "integer",
          "description": "The offset from the first item in the results. For example, 20 indicates that this batch of results starts with the 21st result.",
          "format": "int32"
        },
        "limit": {
          "type": "integer",
          "description": "The number of items the request limited the search to. The number of returned items can be less than the limit if not enough items exist or match the filter criteria.",
          "format": "int32"
        },
        "pageNumber": {
          "type": "integer",
          "description": "The number for this page of the results, starting at 1.",
          "format": "int32"
        },
        "totalPages": {
          "type": "integer",
          "description": "The total number of pages in the results.",
          "format": "int32"
        },
        "totalRecords": {
          "type": "integer",
          "description": "The total number of records in the results.",
          "format": "int32"
        },
        "absoluteTotalRecords": {
          "type": "integer",
          "description": "The absolute total number of records available (unfiltered). This represents the total count without any search or filter applied.",
          "format": "int32"
        },
        "hasPreviousPage": {
          "type": "boolean",
          "description": "Whether there is a previous page of results."
        },
        "hasNextPage": {
          "type": "boolean",
          "description": "Whether there is a next page of results."
        },
        "records": {
          "type": "array",
          "description": "An array of returned records.",
          "items": {
            "$ref": "#/definitions/MinimalDatasetResponseModel"
          }
        }
      },
      "additionalProperties": false
    },
    "ModelsInfo": {
      "type": "object",
      "description": "Information about the ML models and libraries used during processing.",
      "properties": {
        "dateSynthesis": {
          "description": "Date synthesis model configuration.",
          "allOf": [
            {
              "$ref": "#/definitions/DateSynthesis"
            }
          ]
        },
        "fasttext": {
          "description": "FastText language detection model configuration.",
          "allOf": [
            {
              "$ref": "#/definitions/Fasttext"
            }
          ]
        },
        "image": {
          "description": "Image processing model version information.",
          "allOf": [
            {
              "$ref": "#/definitions/Image"
            }
          ]
        },
        "spacy": {
          "description": "spaCy NLP library configuration with auxiliary and multilingual models.",
          "allOf": [
            {
              "$ref": "#/definitions/Spacy"
            }
          ]
        },
        "torch": {
          "description": "PyTorch runtime configuration including GPU availability.",
          "allOf": [
            {
              "$ref": "#/definitions/Torch"
            }
          ]
        },
        "tonicNer": {
          "description": "Tonic NER (Named Entity Recognition) model configuration.",
          "allOf": [
            {
              "$ref": "#/definitions/TonicNer"
            }
          ],
          "x-nullable": true
        },
        "tesseract": {
          "description": "Tesseract OCR engine configuration.",
          "allOf": [
            {
              "$ref": "#/definitions/Tesseract"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    "ModifyResourcePermissionSetAssignmentsModel": {
      "type": "object",
      "description": "Response for modifying the permission set assignments of a dataset.",
      "properties": {
        "granted": {
          "type": "array",
          "description": "The permission set assignments that were granted.",
          "items": {
            "$ref": "#/definitions/ResourcePermissionSetAssignmentModel"
          }
        },
        "revoked": {
          "type": "array",
          "description": "The permission set assignments that were revoked.",
          "items": {
            "$ref": "#/definitions/ResourcePermissionSetAssignmentModel"
          }
        }
      },
      "additionalProperties": false
    },
    "ModifyResourcePermissionSetAssignmentsRequestModel": {
      "type": "object",
      "description": "A request to modify the permission assignments for a dataset.",
      "properties": {
        "grant": {
          "type": "array",
          "description": "The permission sets to grant access to.",
          "items": {
            "$ref": "#/definitions/ResourcePermissionAssignmentRequestModel"
          }
        },
        "revoke": {
          "type": "array",
          "description": "The permission sets to remove access from.",
          "items": {
            "$ref": "#/definitions/ResourcePermissionAssignmentRequestModel"
          }
        }
      },
      "additionalProperties": false
    },
    "NerEntity": {
      "type": "object",
      "description": "A detected named entity with its position, label, confidence score, and optional surrounding context.",
      "properties": {
        "start": {
          "type": "integer",
          "description": "Character offset where the entity starts in the text",
          "format": "int32"
        },
        "end": {
          "type": "integer",
          "description": "Character offset where the entity ends in the text",
          "format": "int32"
        },
        "pythonStart": {
          "type": "integer",
          "description": "Character offset where the entity starts (Python indexing)",
          "format": "int32"
        },
        "pythonEnd": {
          "type": "integer",
          "description": "Character offset where the entity ends (Python indexing)",
          "format": "int32"
        },
        "label": {
          "type": "string",
          "description": "The entity type label (e.g., NAME_GIVEN, EMAIL_ADDRESS)"
        },
        "text": {
          "type": "string",
          "description": "The detected entity text"
        },
        "score": {
          "type": "number",
          "description": "Confidence score between 0 and 1",
          "format": "double"
        },
        "language": {
          "type": "string",
          "description": "The language of the detected entity",
          "x-nullable": true
        },
        "exampleRedaction": {
          "type": "string",
          "description": "An example of what the redacted replacement text looks like",
          "x-nullable": true
        },
        "head": {
          "type": "string",
          "description": "Text immediately preceding the entity",
          "x-nullable": true
        },
        "tail": {
          "type": "string",
          "description": "Text immediately following the entity",
          "x-nullable": true
        },
        "subNerEntities": {
          "type": "array",
          "description": "Sub-entities detected within this entity",
          "items": {
            "$ref": "#/definitions/NerEntity"
          },
          "x-nullable": true
        },
        "modelBasedEntityName": {
          "type": "string",
          "description": "The configured model-based entity that produced this predicted label",
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "OcrServiceProvidersEnum": {
      "type": "string",
      "description": "The OCR engine used for text extraction from images, scanned documents, and PDFs",
      "enum": [
        "Azure",
        "PyTesseract",
        "Textract",
        "SolarOcr",
        "None"
      ]
    },
    "OutputFormatEnum": {
      "type": "string",
      "description": "The output format for redacted files: Original preserves the source format, Markdown produces a markdown version.",
      "enum": [
        "Original",
        "Markdown"
      ]
    },
    "PdfReferenceCodeDisplayMode": {
      "type": "string",
      "description": "Defines how reference codes are displayed in PDF redaction boxes for manual redaction projects.\nReference codes associated with redacted entities will be rendered inside the redaction area\nwith the specified styling.<p>Possible values:</p>\n<ul>\n<li><b>BlackBoxWhiteText</b>: Black box with white text. Redacted areas appear as black boxes with reference codes displayed in white text. This is the default mode and provides high contrast for readability.</li>\n<li><b>WhiteBoxBlackText</b>: White box with black text. Redacted areas appear as white boxes with reference codes displayed in black text. This mode provides a cleaner appearance similar to text highlighting.</li>\n</ul>\n",
      "enum": [
        "BlackBoxWhiteText",
        "WhiteBoxBlackText"
      ]
    },
    "PdfReferenceCodeWorkflowMode": {
      "type": "string",
      "description": "Defines the workflow mode for PDF reference code display in manual redaction projects.\nDetermines whether the redacted text is replaced with a filled box or kept visible with a border.<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Redact mode: Replace text with a filled box containing reference codes inside. The redacted text is completely hidden and replaced with a solid black or white box that displays the reference codes as centered text inside the box. This is the default mode for final deliverables where sensitive data must be completely hidden.</li>\n<li><b>Review</b>: Review mode: Keep original text visible with a red border and reference codes as annotations. The original text remains visible inside a red outlined border (no fill), and reference codes are placed on top of the border as annotation-style labels (similar to reviewer initials or markup). This mode is intended for internal review and quality assurance where reviewers need to verify the original text.</li>\n</ul>\n",
      "enum": [
        "Redact",
        "Review"
      ]
    },
    "PdfSignaturePolicy": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Cover signature with opaque black box</li>\n<li><b>Ignore</b>: Do not attempt to detect signature</li>\n</ul>\n",
      "enum": [
        "Redact",
        "Ignore"
      ]
    },
    "PdfSynthModePolicy": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>V1</b>: Original mode with incorrect font, size and style</li>\n<li><b>V2</b>: Legacy style-aware mode. Persisted V2 values now use the V5 font detector.</li>\n<li><b>V5</b>: Style-aware mode backed by the V5 OpenVINO font model</li>\n</ul>\n",
      "enum": [
        "V1",
        "V2",
        "V5"
      ]
    },
    "PermissionSetModel": {
      "type": "object",
      "description": "A permission set that defines a named collection of operations that can be granted to users or groups.",
      "required": [
        "id",
        "name"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The ID of the permission set."
        },
        "type": {
          "description": "The type discriminator for Permission Sets which determines the kinds of operations available to that Permission Set.<p>Possible values:</p>\n<ul>\n<li><b>Global</b>: Tonic-wide operations</li>\n<li><b>Dataset</b>: Dataset-specific operations</li>\n<li><b>CustomEntity</b>: Custom entity-specific operations</li>\n<li><b>ManualRedactionProject</b>: Manual redaction project operations</li>\n</ul>\n",
          "enum": [
            "Global",
            "Dataset",
            "CustomEntity",
            "ManualRedactionProject"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PermissionSetType"
            }
          ]
        },
        "name": {
          "type": "string",
          "description": "The name of the permission set."
        },
        "isBuiltIn": {
          "type": "boolean",
          "description": "Whether the permission set is built-in."
        },
        "isDefault": {
          "type": "boolean",
          "description": "Whether the permission set is the default permission set for its type."
        },
        "isDisabled": {
          "type": "boolean",
          "description": "Whether the permission set is disabled."
        },
        "lastModifiedDate": {
          "description": "The date when the permission set was last modified.",
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ]
        },
        "operations": {
          "type": "array",
          "description": "The operations of the permission set. Only included for users with `Manage Permission Sets` permission.",
          "items": {
            "type": "integer",
            "format": "int32"
          },
          "x-nullable": true
        },
        "createdDate": {
          "description": "The date when the permission set was created. Only included for users with `Manage Permission Sets` permission.",
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ],
          "x-nullable": true
        },
        "lastModifiedByUserId": {
          "type": "string",
          "description": "The ID of the user who last modified the permission set. Only included for users with `Manage Permission Sets` permission.",
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "PermissionSetType": {
      "type": "string",
      "description": "The type discriminator for Permission Sets which determines the kinds of operations available to that Permission Set.<p>Possible values:</p>\n<ul>\n<li><b>Global</b>: Tonic-wide operations</li>\n<li><b>Dataset</b>: Dataset-specific operations</li>\n<li><b>CustomEntity</b>: Custom entity-specific operations</li>\n<li><b>ManualRedactionProject</b>: Manual redaction project operations</li>\n</ul>\n",
      "enum": [
        "Global",
        "Dataset",
        "CustomEntity",
        "ManualRedactionProject"
      ]
    },
    "PiiTypeEnum": {
      "type": "string",
      "description": "The type of personally identifiable information detected by Solar.",
      "enum": [
        "NUMERIC_VALUE",
        "LANGUAGE",
        "MONEY",
        "PRODUCT",
        "EVENT",
        "LAW",
        "US_PASSPORT",
        "MEDICAL_LICENSE",
        "DATE_TIME",
        "US_BANK_NUMBER",
        "NRP",
        "US_SSN",
        "IP_ADDRESS",
        "ORGANIZATION",
        "PHONE_NUMBER",
        "US_ITIN",
        "LOCATION",
        "LOCATION_ADDRESS",
        "LOCATION_CITY",
        "LOCATION_STATE",
        "LOCATION_ZIP",
        "LOCATION_COUNTRY",
        "CREDIT_CARD",
        "EMAIL_ADDRESS",
        "IBAN_CODE",
        "URL",
        "NAME_GIVEN",
        "NAME_FAMILY",
        "GENDER_IDENTIFIER",
        "OCCUPATION",
        "PERSON_AGE",
        "DOB",
        "CC_EXP",
        "CVV",
        "MICR_CODE",
        "HEALTHCARE_ID",
        "NUMERIC_PII",
        "LOCATION_COMPLETE_ADDRESS",
        "US_ROUTING_TRANSIT_NUMBER",
        "ACCOUNT_NUMBER",
        "DRIVERS_LICENSE_NUMBER",
        "VEHICLE_ID"
      ]
    },
    "PiiTypeGeneratorStateEnum": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>Off</b>: Ignore the PII type</li>\n<li><b>Synthesis</b>: Synthesize a new, realistic entity</li>\n<li><b>Redaction</b>: Tokenize the entity, e.g. [NAME_GIVEN_ssys5]</li>\n<li><b>GroupingSynthesis</b>: Synthesize entities using consistent grouping across the document</li>\n<li><b>ReplacementSynthesis</b>: Replace entities with LLM generated values. ReplacementSynthesis is no longer used</li>\n</ul>\n",
      "enum": [
        "Off",
        "Synthesis",
        "Redaction",
        "GroupingSynthesis",
        "ReplacementSynthesis"
      ]
    },
    "PptxCommentPolicy": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>Remove</b>: Remove all comments (and comment authors) from the presentation</li>\n<li><b>Ignore</b>: Leave comments alone</li>\n</ul>\n",
      "enum": [
        "Remove",
        "Ignore"
      ]
    },
    "PptxFacePolicy": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected faces in pictures alone. The default.</li>\n<li><b>Remove</b>: Paint detected faces in slide, notes, layout and master pictures black, regardless of the image policy.</li>\n</ul>\n",
      "enum": [
        "Ignore",
        "Remove"
      ]
    },
    "PptxImagePolicy": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Run pictures embedded in slides and speaker notes through OCR and redact sensitive text</li>\n<li><b>Ignore</b>: Leave pictures alone</li>\n<li><b>Remove</b>: Replace each picture with an opaque black box of the same size</li>\n</ul>\n",
      "enum": [
        "Redact",
        "Ignore",
        "Remove"
      ]
    },
    "PptxLogoPolicy": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected logos in pictures alone</li>\n<li><b>Remove</b>: Paint detected logos in slide, notes, layout and master pictures black, regardless of the image policy.</li>\n</ul>\n",
      "enum": [
        "Ignore",
        "Remove"
      ]
    },
    "PptxSignaturePolicy": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected signatures in pictures alone. The default: a deck's pictures are mostly icons, charts and photos, which the detector confuses with signatures, and a slide rarely carries a real one.</li>\n<li><b>Remove</b>: Paint detected signatures in slide, notes, layout and master pictures black, regardless of the image policy. For pictures hosted by a presentation this replaces</li>\n</ul>\n",
      "enum": [
        "Ignore",
        "Remove"
      ]
    },
    "PptxTablePolicy": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Treat table content normally, feed into redaction process.</li>\n<li><b>Remove</b>: Replace all characters and symbols in table cells with a placeholder.</li>\n</ul>\n",
      "enum": [
        "Redact",
        "Remove"
      ]
    },
    "ProblemDetails": {
      "type": "object",
      "description": "Standard error response following RFC 7807, containing error type, title, status code, and detail message.",
      "properties": {
        "type": {
          "type": "string",
          "x-nullable": true
        },
        "title": {
          "type": "string",
          "x-nullable": true
        },
        "status": {
          "type": "integer",
          "format": "int32",
          "x-nullable": true
        },
        "detail": {
          "type": "string",
          "x-nullable": true
        },
        "instance": {
          "type": "string",
          "x-nullable": true
        }
      }
    },
    "RecordApiRequestOptions": {
      "type": "object",
      "description": "Options for recording an API request for audit review, including tagging.",
      "properties": {
        "tags": {
          "type": "array",
          "description": "Tags to assign to the request, makes search and retrieval easier. Optional: omitting it is\nequivalent to an empty list.",
          "items": {
            "type": "string"
          },
          "x-nullable": true
        },
        "record": {
          "type": "boolean",
          "description": "When explicitly false, suppresses recording of this request regardless of the organization's\nrequest auditing settings. When true or null, recording defers to the organization's settings\n(a per-request opt-in does not force recording).",
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "RedactionRequest": {
      "type": "object",
      "description": "Request to redact PII from plain text.",
      "properties": {
        "generatorConfig": {
          "type": "object",
          "description": "A dictionary of entity types to their transformation type.",
          "example": {
            "NAME_GIVEN": "Redaction",
            "NAME_FAMILY": "Redaction"
          }
        },
        "generatorDefault": {
          "description": "The default type of transformation to apply to each entity.<p>Possible values:</p>\n<ul>\n<li><b>Off</b>: Ignore the PII type</li>\n<li><b>Synthesis</b>: Synthesize a new, realistic entity</li>\n<li><b>Redaction</b>: Tokenize the entity, e.g. [NAME_GIVEN_ssys5]</li>\n<li><b>GroupingSynthesis</b>: Synthesize entities using consistent grouping across the document</li>\n<li><b>ReplacementSynthesis</b>: Replace entities with LLM generated values. ReplacementSynthesis is no longer used</li>\n</ul>\n",
          "enum": [
            "Off",
            "Synthesis",
            "Redaction",
            "GroupingSynthesis",
            "ReplacementSynthesis"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PiiTypeGeneratorStateEnum"
            }
          ],
          "example": "Off"
        },
        "docXImagePolicy": {
          "description": "Policy for handling DocX Images<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Run images through OCR and redact sensitive text</li>\n<li><b>Ignore</b>: Leave images alone</li>\n<li><b>Remove</b>: Cover image with opaque black box</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXImagePolicy"
            }
          ]
        },
        "rtfImagePolicy": {
          "description": "Policy for handling images in RTF files (JSON datasets only)<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave images alone</li>\n<li><b>Remove</b>: Replace each image with an opaque black box of the same size</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/RtfImagePolicy"
            }
          ]
        },
        "docXCommentPolicy": {
          "description": "Policy for handling DocX comments<p>Possible values:</p>\n<ul>\n<li><b>Remove</b>: Remove all comments for file</li>\n<li><b>Ignore</b>: Leave comments alone</li>\n</ul>\n",
          "enum": [
            "Remove",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXCommentPolicy"
            }
          ]
        },
        "pdfSignaturePolicy": {
          "description": "Policy for handling PDF signatures<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Cover signature with opaque black box</li>\n<li><b>Ignore</b>: Do not attempt to detect signature</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PdfSignaturePolicy"
            }
          ]
        },
        "pdfSynthModePolicy": {
          "description": "Policy for handling PDF and image synthesis mode<p>Possible values:</p>\n<ul>\n<li><b>V1</b>: Original mode with incorrect font, size and style</li>\n<li><b>V2</b>: Legacy style-aware mode. Persisted V2 values now use the V5 font detector.</li>\n<li><b>V5</b>: Style-aware mode backed by the V5 OpenVINO font model</li>\n</ul>\n",
          "enum": [
            "V1",
            "V2",
            "V5"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PdfSynthModePolicy"
            }
          ]
        },
        "docXTablePolicy": {
          "description": "Policy for handling tables in Word Documents<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Treat table content normally, feed into redaction process.</li>\n<li><b>Remove</b>: Replace all characters and symbols in table with a placeholder.</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXTablePolicy"
            }
          ]
        },
        "pptxImagePolicy": {
          "description": "Policy for handling pictures in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Run pictures embedded in slides and speaker notes through OCR and redact sensitive text</li>\n<li><b>Ignore</b>: Leave pictures alone</li>\n<li><b>Remove</b>: Replace each picture with an opaque black box of the same size</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxImagePolicy"
            }
          ]
        },
        "pptxCommentPolicy": {
          "description": "Policy for handling comments in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Remove</b>: Remove all comments (and comment authors) from the presentation</li>\n<li><b>Ignore</b>: Leave comments alone</li>\n</ul>\n",
          "enum": [
            "Remove",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxCommentPolicy"
            }
          ]
        },
        "pptxTablePolicy": {
          "description": "Policy for handling tables in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Treat table content normally, feed into redaction process.</li>\n<li><b>Remove</b>: Replace all characters and symbols in table cells with a placeholder.</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxTablePolicy"
            }
          ]
        },
        "pptxLogoPolicy": {
          "description": "Policy for detected logos in PowerPoint pictures: Ignore (default) or Remove (paint black)<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected logos in pictures alone</li>\n<li><b>Remove</b>: Paint detected logos in slide, notes, layout and master pictures black, regardless of the image policy.</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxLogoPolicy"
            }
          ]
        },
        "pptxSignaturePolicy": {
          "description": "Policy for detected signatures in PowerPoint pictures: Ignore (default) or Remove (paint black). Replaces the PDF signature policy for PowerPoint pictures.<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected signatures in pictures alone. The default: a deck's pictures are mostly icons, charts and photos, which the detector confuses with signatures, and a slide rarely carries a real one.</li>\n<li><b>Remove</b>: Paint detected signatures in slide, notes, layout and master pictures black, regardless of the image policy. For pictures hosted by a presentation this replaces</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxSignaturePolicy"
            }
          ]
        },
        "pptxFacePolicy": {
          "description": "Policy for detected faces in PowerPoint pictures: Ignore (default) or Remove (paint black). Independent of the PowerPoint image policy.<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected faces in pictures alone. The default.</li>\n<li><b>Remove</b>: Paint detected faces in slide, notes, layout and master pictures black, regardless of the image policy.</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxFacePolicy"
            }
          ]
        },
        "llmClassificationPolicy": {
          "description": "Controls LLM use for entity processing. Enabled reviews detected entities. PdfIdentificationAndSynthesis uses the LLM for dataset PDF PII identification and synthesis. Both modes add latency and require an LLM to be configured on the instance.<p>Possible values:</p>\n<ul>\n<li><b>Disabled</b>: Do not use LLM for structured data classification</li>\n<li><b>Enabled</b>: Use LLM to classify structured data for PII detection</li>\n<li><b>PdfIdentificationAndSynthesis</b>: Use an LLM instead of the NER model and C# generators for PDF PII identification and synthesis. Other file types continue to use their existing detection and synthesis paths.</li>\n</ul>\n",
          "enum": [
            "Disabled",
            "Enabled",
            "PdfIdentificationAndSynthesis"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/LlmClassificationPolicy"
            }
          ]
        },
        "llmTableClassificationPolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/LlmClassificationPolicy"
            }
          ],
          "x-nullable": true
        },
        "labelBlockLists": {
          "type": "object",
          "description": "A list of regexes to match against the specified entity type for exclusion. Legacy strings inputs are accepted and normalized into regexes.",
          "example": {
            "NAME_FAMILY": {
              "regexes": [
                ".*\\s(disease|syndrom|disorder)"
              ]
            }
          }
        },
        "labelAllowLists": {
          "type": "object",
          "description": "A list of regexes to match against the specified entity type for inclusion. Legacy strings inputs are accepted and normalized into regexes.",
          "example": {
            "HEALTHCARE_ID": {
              "regexes": [
                "[a-z]{2}\\d{9}"
              ]
            }
          }
        },
        "generatorMetadata": {
          "type": "object",
          "description": "A dictionary mapping entity type names to their transformation metadata configuration."
        },
        "recordApiRequestOptions": {
          "description": "Options for recording an API request for audit review, including tagging.",
          "allOf": [
            {
              "$ref": "#/definitions/RecordApiRequestOptions"
            }
          ],
          "x-nullable": true
        },
        "customPiiEntityIds": {
          "type": "array",
          "description": "A list of custom Pii Entity names to use for NER",
          "items": {
            "type": "string"
          },
          "x-nullable": true
        },
        "customEntityRankingModes": {
          "type": "object",
          "description": "Optional per-entity ranking overrides for custom-PII and model-based entities detected in\nthis request. Keys are entity Names (the same identifiers used in Solar.Core.Models.BaseApiRedactionRequest.CustomPiiEntityIds);\nvalues control whether the custom entity always wins an exact-boundary overlap against a\nbuilt-in entity (`Prioritized`) or is compared by score (`Standard`). Omit to keep\ntoday's behavior of treating every requested custom entity as Prioritized. Supplying a key\nthat does not match any requested custom-PII or model-based entity Name is rejected as a\n400 error.",
          "example": {
            "MY_CUSTOM_ENTITY": "Standard"
          },
          "x-nullable": true
        },
        "customEntityConfidenceThresholds": {
          "type": "object",
          "description": "Optional per-entity minimum detection confidence thresholds for custom-PII and model-based\nentities detected in this request. Keys are entity Names (the same identifiers used in\nSolar.Core.Models.BaseApiRedactionRequest.CustomPiiEntityIds); each value is in (0, 1], and detections for that entity\nwhose score falls below it are ignored. Omit to keep today's behavior of no confidence\ncutoff. Supplying a key that does not match any requested custom-PII or model-based entity\nName, or a value outside (0, 1], is rejected as a 400 error.",
          "additionalProperties": {
            "type": "number",
            "format": "double"
          },
          "example": {
            "MY_CUSTOM_ENTITY": 0.5
          },
          "x-nullable": true
        },
        "text": {
          "type": "string",
          "description": "The plain text to redact",
          "example": "My name is John Smith"
        },
        "includeEntityLinkingScores": {
          "type": "boolean",
          "description": "Include entity-linking confidence scores when GroupingSynthesis performs entity linking. The default value is False."
        },
        "entityLinkingScoreLimit": {
          "type": "integer",
          "description": "Maximum number of entity-linking scores to return. Set to null for no limit.",
          "format": "int32",
          "maximum": 2147483647,
          "minimum": 1,
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "RedactionSdkModel": {
      "type": "object",
      "description": "The result of a redaction operation, containing the original text, redacted text, and details of each entity replacement.",
      "properties": {
        "originalText": {
          "type": "string",
          "description": "The original input text before redaction."
        },
        "redactedText": {
          "type": "string",
          "description": "The text after redaction has been applied."
        },
        "usage": {
          "type": "integer",
          "description": "The number of words processed.",
          "format": "int64"
        },
        "deIdentifyResults": {
          "type": "array",
          "description": "The list of entity replacements that were made during redaction.",
          "items": {
            "$ref": "#/definitions/ReplacementSdkModel"
          }
        },
        "entityLinkingGroups": {
          "type": "array",
          "description": "The entity groups used to produce GroupingSynthesis replacements. Group\nmembers match the entityLinkingIndex on Solar.Core.Models.FilePreview.RedactionSdkModel.DeIdentifyResults.",
          "items": {
            "$ref": "#/definitions/EntityLinkingGroupSdkModel"
          },
          "x-nullable": true
        },
        "entityLinkingScoreMatrix": {
          "type": "array",
          "description": "Upper-triangular entity-linking score matrix indexed by entityLinkingIndex on\nSolar.Core.Models.FilePreview.RedactionSdkModel.DeIdentifyResults. For entity indices i < j, the score is\nmatrix[i][j - i - 1]. Unavailable scores are null.",
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/definitions/EntityLinkingPairScoreSdkModel"
            }
          },
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "Replacement": {
      "type": "object",
      "properties": {
        "start": {
          "type": "integer",
          "format": "int32"
        },
        "end": {
          "type": "integer",
          "format": "int32"
        },
        "newStart": {
          "type": "integer",
          "format": "int32"
        },
        "newEnd": {
          "type": "integer",
          "format": "int32"
        },
        "pythonStart": {
          "type": "integer",
          "format": "int32",
          "x-nullable": true
        },
        "pythonEnd": {
          "type": "integer",
          "format": "int32",
          "x-nullable": true
        },
        "label": {
          "type": "string"
        },
        "text": {
          "type": "string"
        },
        "newText": {
          "type": "string",
          "x-nullable": true
        },
        "score": {
          "type": "number",
          "format": "double"
        },
        "language": {
          "type": "string",
          "x-nullable": true
        },
        "exampleRedaction": {
          "type": "string",
          "x-nullable": true
        },
        "jsonPath": {
          "type": "string",
          "x-nullable": true
        },
        "xmlPath": {
          "type": "string",
          "x-nullable": true
        },
        "head": {
          "type": "string",
          "x-nullable": true
        },
        "tail": {
          "type": "string",
          "x-nullable": true
        },
        "modelBasedEntityName": {
          "type": "string",
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "ReplacementSdkModel": {
      "type": "object",
      "description": "Details of a single entity replacement made during redaction.",
      "properties": {
        "start": {
          "type": "integer",
          "description": "The start character index of the detected entity in the original text.",
          "format": "int32"
        },
        "end": {
          "type": "integer",
          "description": "The end character index of the detected entity in the original text.",
          "format": "int32"
        },
        "newStart": {
          "type": "integer",
          "description": "The start character index of the replacement in the redacted text.",
          "format": "int32"
        },
        "newEnd": {
          "type": "integer",
          "description": "The end character index of the replacement in the redacted text.",
          "format": "int32"
        },
        "label": {
          "type": "string",
          "description": "The entity type label (e.g. NAME_GIVEN, LOCATION, DATE_TIME)."
        },
        "text": {
          "type": "string",
          "description": "The original text of the detected entity."
        },
        "newText": {
          "type": "string",
          "description": "The replacement text that was substituted for the original entity.",
          "x-nullable": true
        },
        "score": {
          "type": "number",
          "description": "The confidence score of the entity detection, between 0 and 1.",
          "format": "double"
        },
        "language": {
          "type": "string",
          "description": "The detected language of the text containing the entity.",
          "x-nullable": true
        },
        "exampleRedaction": {
          "type": "string",
          "description": "An example of what the redacted value looks like, if applicable.",
          "x-nullable": true
        },
        "jsonPath": {
          "type": "string",
          "description": "The JSON path of the entity, if the source was a JSON document.",
          "x-nullable": true
        },
        "xmlPath": {
          "type": "string",
          "description": "The XML path of the entity, if the source was an XML document.",
          "x-nullable": true
        },
        "idx": {
          "type": "integer",
          "description": "The index of the text in the bulk request array, if from a bulk redaction operation.",
          "format": "int32",
          "x-nullable": true
        },
        "entityLinkingIndex": {
          "type": "integer",
          "description": "The dense index used by entity-linking groups, edges, and score matrices.",
          "format": "int32",
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "RequestAuditorSettingsModel": {
      "type": "object",
      "properties": {
        "enabled": {
          "type": "boolean"
        },
        "samplingRate": {
          "type": "number",
          "format": "double"
        },
        "triggerUserReviewThreshold": {
          "type": "number",
          "format": "double"
        },
        "logRetentionPeriodDays": {
          "type": "integer",
          "format": "int32"
        }
      },
      "additionalProperties": false
    },
    "RequestAuditorSettingsRequestModel": {
      "type": "object",
      "properties": {
        "enabled": {
          "type": "boolean"
        },
        "samplingRate": {
          "type": "number",
          "format": "double",
          "maximum": 1,
          "minimum": 0,
          "exclusiveMinimum": true
        },
        "triggerUserReviewThreshold": {
          "type": "number",
          "format": "double",
          "maximum": 1,
          "minimum": 0
        },
        "logRetentionPeriodDays": {
          "type": "integer",
          "format": "int32",
          "maximum": 365,
          "minimum": 1
        }
      },
      "additionalProperties": false
    },
    "ResourcePermissionAssignmentRequestModel": {
      "type": "object",
      "description": "References the user or group and the set of permissions to modify on a dataset.",
      "required": [
        "permissionSetId"
      ],
      "properties": {
        "sharedWithUserId": {
          "type": "string",
          "description": "The user that is shared a permission set. This field should be left null if sharing with a group.",
          "x-nullable": true
        },
        "sharedWithGroupId": {
          "type": "string",
          "description": "The group that is shared a permission set. This field should be left null if sharing with a user.",
          "x-nullable": true
        },
        "permissionSetId": {
          "type": "string",
          "description": "The ID of the permission set to assign."
        }
      },
      "additionalProperties": false
    },
    "ResourcePermissionSetAssignmentModel": {
      "type": "object",
      "description": "A model that represents a user or a group that was assigned a permission set for a dataset.",
      "properties": {
        "id": {
          "type": "string",
          "description": "The ID of the share."
        },
        "permissionSetId": {
          "type": "string",
          "description": "The ID of the permission set that is shared."
        },
        "sharedWithUser": {
          "description": "The user that the dataset is shared with. If the dataset is shared with a group, then this field is null.",
          "allOf": [
            {
              "$ref": "#/definitions/UserEntityModel"
            }
          ],
          "x-nullable": true
        },
        "sharedWithGroup": {
          "description": "The group that the dataset is shared with. If the dataset is shared with a user, then this field is null.",
          "allOf": [
            {
              "$ref": "#/definitions/GroupEntityModel"
            }
          ],
          "x-nullable": true
        },
        "shareableEntityType": {
          "description": "Indicates whether the dataset was shared with a user or with a group.<p>Possible values:</p>\n<ul>\n<li><b>User</b>: A user</li>\n<li><b>Group</b>: A group</li>\n</ul>\n",
          "enum": [
            "User",
            "Group"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/ShareableEntityTypeEnum"
            }
          ]
        },
        "resourceId": {
          "type": "string",
          "description": "The ID of the dataset that is shared."
        }
      },
      "additionalProperties": false
    },
    "RtfImagePolicy": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave images alone</li>\n<li><b>Remove</b>: Replace each image with an opaque black box of the same size</li>\n</ul>\n",
      "enum": [
        "Ignore",
        "Remove"
      ]
    },
    "ShareableEntityTypeEnum": {
      "type": "string",
      "description": "<p>Possible values:</p>\n<ul>\n<li><b>User</b>: A user</li>\n<li><b>Group</b>: A group</li>\n</ul>\n",
      "enum": [
        "User",
        "Group"
      ]
    },
    "SolarCsvConfig": {
      "type": "object",
      "description": "Configuration for parsing the CSV file.",
      "properties": {
        "numColumns": {
          "type": "integer",
          "description": "The number of columns in the CSV file.",
          "format": "int32"
        },
        "hasHeader": {
          "type": "boolean",
          "description": "Whether the CSV file has a header row."
        },
        "escapeChar": {
          "type": "string",
          "description": "The character used to escape special characters in the CSV file."
        },
        "quoteChar": {
          "type": "string",
          "description": "The character used to quote fields in the CSV file."
        },
        "delimiter": {
          "type": "string",
          "description": "The delimiter used to separate fields in the CSV file."
        },
        "nullChar": {
          "type": "string",
          "description": "The character used to represent null values in the CSV file."
        }
      },
      "additionalProperties": false
    },
    "SortDirection": {
      "type": "string",
      "description": "Sort order direction: ascending (Asc) or descending (Desc).",
      "enum": [
        "Asc",
        "Desc"
      ]
    },
    "SortableField": {
      "type": "string",
      "description": "Fields available for sorting search results: Name, LastUpdated, or CreatedDate.",
      "enum": [
        "Name",
        "LastUpdated",
        "CreatedDate",
        "FileCount"
      ]
    },
    "Spacy": {
      "type": "object",
      "description": "spaCy NLP library configuration with auxiliary and multilingual models.",
      "properties": {
        "libVersion": {
          "type": "string"
        },
        "auxModel": {
          "description": "A single spaCy model instance with name, language, and version.",
          "allOf": [
            {
              "$ref": "#/definitions/SpacyModel"
            }
          ]
        },
        "multilingualModels": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/SpacyModel"
          }
        }
      },
      "additionalProperties": false
    },
    "SpacyModel": {
      "type": "object",
      "description": "A single spaCy model instance with name, language, and version.",
      "properties": {
        "name": {
          "type": "string"
        },
        "language": {
          "type": "string"
        },
        "runsOnGpu": {
          "type": "boolean"
        },
        "version": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "StructuredTableRedactionRequest": {
      "type": "object",
      "properties": {
        "columns": {
          "type": "array",
          "items": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "piiTypes": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "generatorMetadata": {
          "type": "object",
          "description": "A dictionary mapping entity type names to their transformation metadata configuration.",
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "Tesseract": {
      "type": "object",
      "description": "Tesseract OCR engine configuration.",
      "properties": {
        "model": {
          "description": "Tesseract model identity with ID and version.",
          "allOf": [
            {
              "$ref": "#/definitions/TesseractModel"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    "TesseractModel": {
      "type": "object",
      "description": "Tesseract model identity with ID and version.",
      "properties": {
        "id": {
          "type": "string"
        },
        "version": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "TonicNer": {
      "type": "object",
      "description": "Tonic NER (Named Entity Recognition) model configuration.",
      "properties": {
        "enModel": {
          "type": "string"
        },
        "xlmModel": {
          "type": "string"
        },
        "textualMultiLingual": {
          "type": "boolean",
          "description": "Whether the service is configured to run in multilingual NER mode\n(mirrors the Python `TEXTUAL_MULTI_LINGUAL` environment variable)."
        },
        "textualMultiLingualXlmOnly": {
          "type": "boolean",
          "description": "Whether the service is configured to use the XLM model exclusively\n(mirrors the Python `TEXTUAL_MULTI_LINGUAL_XLM_ONLY` environment variable).\nReflects raw configuration; no effect unless Solar.Core.Models.TonicNer.TextualMultiLingual is also true."
        }
      },
      "additionalProperties": false
    },
    "Torch": {
      "type": "object",
      "description": "PyTorch runtime configuration including GPU availability.",
      "properties": {
        "gpuAvailable": {
          "type": "boolean"
        },
        "libVersion": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "TranscriptionResult": {
      "type": "object",
      "description": "Result of an audio transcription job, containing the full transcript text, language, and time-aligned segments.",
      "properties": {
        "text": {
          "type": "string",
          "description": "The full transcription text"
        },
        "segments": {
          "type": "array",
          "description": "Time-aligned segments of the transcription",
          "items": {
            "$ref": "#/definitions/TranscriptionSegment"
          }
        },
        "language": {
          "type": "string",
          "description": "Detected language of the audio"
        }
      },
      "additionalProperties": false
    },
    "TranscriptionSegment": {
      "type": "object",
      "description": "A time-aligned segment of a transcription containing text and individual word timings.",
      "properties": {
        "start": {
          "type": "number",
          "format": "double"
        },
        "end": {
          "type": "number",
          "format": "double"
        },
        "id": {
          "type": "integer",
          "format": "int64"
        },
        "text": {
          "type": "string"
        },
        "words": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/TranscriptionWord"
          }
        }
      },
      "additionalProperties": false
    },
    "TranscriptionWord": {
      "type": "object",
      "description": "A single word within a transcription segment with start and end timestamps in milliseconds.",
      "properties": {
        "start": {
          "type": "number",
          "format": "double"
        },
        "end": {
          "type": "number",
          "format": "double"
        },
        "word": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "UnattachedFileMinimalApiModel": {
      "type": "object",
      "description": "Response model returned after uploading a file for redaction.",
      "properties": {
        "jobId": {
          "type": "string",
          "description": "The unique identifier for the redaction job. Use this identifier to check processing status and download the redacted file.",
          "example": "b3a1c9f0-4e5d-4a2b-8f7c-1d2e3f4a5b6c"
        }
      },
      "additionalProperties": false
    },
    "UploadedFileResponseModel": {
      "type": "object",
      "description": "Response model returned after uploading a file to a dataset.",
      "properties": {
        "updatedDataset": {
          "description": "The updated dataset after the file was uploaded.",
          "allOf": [
            {
              "$ref": "#/definitions/DatasetResponseModel"
            }
          ]
        },
        "uploadedFileId": {
          "type": "string",
          "description": "The identifier of the newly uploaded file."
        }
      },
      "additionalProperties": false
    },
    "UserEntityMetadata": {
      "type": "object",
      "description": "Account-level metadata for a user, including creation and activity timestamps.",
      "properties": {
        "createdAt": {
          "description": "The date and time when the user account was created.",
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ]
        },
        "lastActivityDate": {
          "description": "The date and time of the user's most recent activity, if any.",
          "allOf": [
            {
              "$ref": "#/definitions/Instant"
            }
          ],
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "UserEntityModel": {
      "type": "object",
      "description": "A user entity with basic identity information.",
      "required": [
        "id",
        "userName"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The unique identifier of the user or group."
        },
        "userName": {
          "type": "string",
          "description": "The display name of the user or group.",
          "x-nullable": true
        },
        "firstName": {
          "type": "string",
          "description": "The user's first name.",
          "x-nullable": true
        },
        "lastName": {
          "type": "string",
          "description": "The user's last name.",
          "x-nullable": true
        }
      },
      "additionalProperties": false
    },
    "UserPhotoModel": {
      "type": "object",
      "description": "Metadata about a user's profile photo.",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "The file name of the photo."
        },
        "url": {
          "type": "string",
          "description": "The URL where the photo can be accessed, if available.",
          "x-nullable": true
        },
        "fileType": {
          "type": "string",
          "description": "The MIME type of the photo (e.g. image/png).",
          "x-nullable": true
        },
        "content": {
          "type": "string",
          "description": "The raw byte content of the photo, if loaded.",
          "format": "byte",
          "x-nullable": true
        },
        "isManualUpload": {
          "type": "boolean",
          "description": "Whether the photo was manually uploaded by the user (as opposed to sourced from SSO)."
        }
      },
      "additionalProperties": false
    },
    "XmlRedactionRequest": {
      "type": "object",
      "description": "Request to redact PII from an XML document.",
      "properties": {
        "generatorConfig": {
          "type": "object",
          "description": "A dictionary of entity types to their transformation type.",
          "example": {
            "NAME_GIVEN": "Redaction",
            "NAME_FAMILY": "Redaction"
          }
        },
        "generatorDefault": {
          "description": "The default type of transformation to apply to each entity.<p>Possible values:</p>\n<ul>\n<li><b>Off</b>: Ignore the PII type</li>\n<li><b>Synthesis</b>: Synthesize a new, realistic entity</li>\n<li><b>Redaction</b>: Tokenize the entity, e.g. [NAME_GIVEN_ssys5]</li>\n<li><b>GroupingSynthesis</b>: Synthesize entities using consistent grouping across the document</li>\n<li><b>ReplacementSynthesis</b>: Replace entities with LLM generated values. ReplacementSynthesis is no longer used</li>\n</ul>\n",
          "enum": [
            "Off",
            "Synthesis",
            "Redaction",
            "GroupingSynthesis",
            "ReplacementSynthesis"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PiiTypeGeneratorStateEnum"
            }
          ],
          "example": "Off"
        },
        "docXImagePolicy": {
          "description": "Policy for handling DocX Images<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Run images through OCR and redact sensitive text</li>\n<li><b>Ignore</b>: Leave images alone</li>\n<li><b>Remove</b>: Cover image with opaque black box</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXImagePolicy"
            }
          ]
        },
        "rtfImagePolicy": {
          "description": "Policy for handling images in RTF files (JSON datasets only)<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave images alone</li>\n<li><b>Remove</b>: Replace each image with an opaque black box of the same size</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/RtfImagePolicy"
            }
          ]
        },
        "docXCommentPolicy": {
          "description": "Policy for handling DocX comments<p>Possible values:</p>\n<ul>\n<li><b>Remove</b>: Remove all comments for file</li>\n<li><b>Ignore</b>: Leave comments alone</li>\n</ul>\n",
          "enum": [
            "Remove",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXCommentPolicy"
            }
          ]
        },
        "pdfSignaturePolicy": {
          "description": "Policy for handling PDF signatures<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Cover signature with opaque black box</li>\n<li><b>Ignore</b>: Do not attempt to detect signature</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PdfSignaturePolicy"
            }
          ]
        },
        "pdfSynthModePolicy": {
          "description": "Policy for handling PDF and image synthesis mode<p>Possible values:</p>\n<ul>\n<li><b>V1</b>: Original mode with incorrect font, size and style</li>\n<li><b>V2</b>: Legacy style-aware mode. Persisted V2 values now use the V5 font detector.</li>\n<li><b>V5</b>: Style-aware mode backed by the V5 OpenVINO font model</li>\n</ul>\n",
          "enum": [
            "V1",
            "V2",
            "V5"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PdfSynthModePolicy"
            }
          ]
        },
        "docXTablePolicy": {
          "description": "Policy for handling tables in Word Documents<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Treat table content normally, feed into redaction process.</li>\n<li><b>Remove</b>: Replace all characters and symbols in table with a placeholder.</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/DocXTablePolicy"
            }
          ]
        },
        "pptxImagePolicy": {
          "description": "Policy for handling pictures in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Run pictures embedded in slides and speaker notes through OCR and redact sensitive text</li>\n<li><b>Ignore</b>: Leave pictures alone</li>\n<li><b>Remove</b>: Replace each picture with an opaque black box of the same size</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxImagePolicy"
            }
          ]
        },
        "pptxCommentPolicy": {
          "description": "Policy for handling comments in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Remove</b>: Remove all comments (and comment authors) from the presentation</li>\n<li><b>Ignore</b>: Leave comments alone</li>\n</ul>\n",
          "enum": [
            "Remove",
            "Ignore"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxCommentPolicy"
            }
          ]
        },
        "pptxTablePolicy": {
          "description": "Policy for handling tables in PowerPoint presentations<p>Possible values:</p>\n<ul>\n<li><b>Redact</b>: Treat table content normally, feed into redaction process.</li>\n<li><b>Remove</b>: Replace all characters and symbols in table cells with a placeholder.</li>\n</ul>\n",
          "enum": [
            "Redact",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxTablePolicy"
            }
          ]
        },
        "pptxLogoPolicy": {
          "description": "Policy for detected logos in PowerPoint pictures: Ignore (default) or Remove (paint black)<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected logos in pictures alone</li>\n<li><b>Remove</b>: Paint detected logos in slide, notes, layout and master pictures black, regardless of the image policy.</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxLogoPolicy"
            }
          ]
        },
        "pptxSignaturePolicy": {
          "description": "Policy for detected signatures in PowerPoint pictures: Ignore (default) or Remove (paint black). Replaces the PDF signature policy for PowerPoint pictures.<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected signatures in pictures alone. The default: a deck's pictures are mostly icons, charts and photos, which the detector confuses with signatures, and a slide rarely carries a real one.</li>\n<li><b>Remove</b>: Paint detected signatures in slide, notes, layout and master pictures black, regardless of the image policy. For pictures hosted by a presentation this replaces</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxSignaturePolicy"
            }
          ]
        },
        "pptxFacePolicy": {
          "description": "Policy for detected faces in PowerPoint pictures: Ignore (default) or Remove (paint black). Independent of the PowerPoint image policy.<p>Possible values:</p>\n<ul>\n<li><b>Ignore</b>: Leave detected faces in pictures alone. The default.</li>\n<li><b>Remove</b>: Paint detected faces in slide, notes, layout and master pictures black, regardless of the image policy.</li>\n</ul>\n",
          "enum": [
            "Ignore",
            "Remove"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/PptxFacePolicy"
            }
          ]
        },
        "llmClassificationPolicy": {
          "description": "Controls LLM use for entity processing. Enabled reviews detected entities. PdfIdentificationAndSynthesis uses the LLM for dataset PDF PII identification and synthesis. Both modes add latency and require an LLM to be configured on the instance.<p>Possible values:</p>\n<ul>\n<li><b>Disabled</b>: Do not use LLM for structured data classification</li>\n<li><b>Enabled</b>: Use LLM to classify structured data for PII detection</li>\n<li><b>PdfIdentificationAndSynthesis</b>: Use an LLM instead of the NER model and C# generators for PDF PII identification and synthesis. Other file types continue to use their existing detection and synthesis paths.</li>\n</ul>\n",
          "enum": [
            "Disabled",
            "Enabled",
            "PdfIdentificationAndSynthesis"
          ],
          "allOf": [
            {
              "$ref": "#/definitions/LlmClassificationPolicy"
            }
          ]
        },
        "llmTableClassificationPolicy": {
          "allOf": [
            {
              "$ref": "#/definitions/LlmClassificationPolicy"
            }
          ],
          "x-nullable": true
        },
        "labelBlockLists": {
          "type": "object",
          "description": "A list of regexes to match against the specified entity type for exclusion. Legacy strings inputs are accepted and normalized into regexes.",
          "example": {
            "NAME_FAMILY": {
              "regexes": [
                ".*\\s(disease|syndrom|disorder)"
              ]
            }
          }
        },
        "labelAllowLists": {
          "type": "object",
          "description": "A list of regexes to match against the specified entity type for inclusion. Legacy strings inputs are accepted and normalized into regexes.",
          "example": {
            "HEALTHCARE_ID": {
              "regexes": [
                "[a-z]{2}\\d{9}"
              ]
            }
          }
        },
        "generatorMetadata": {
          "type": "object",
          "description": "A dictionary mapping entity type names to their transformation metadata configuration."
        },
        "recordApiRequestOptions": {
          "description": "Options for recording an API request for audit review, including tagging.",
          "allOf": [
            {
              "$ref": "#/definitions/RecordApiRequestOptions"
            }
          ],
          "x-nullable": true
        },
        "customPiiEntityIds": {
          "type": "array",
          "description": "A list of custom Pii Entity names to use for NER",
          "items": {
            "type": "string"
          },
          "x-nullable": true
        },
        "customEntityRankingModes": {
          "type": "object",
          "description": "Optional per-entity ranking overrides for custom-PII and model-based entities detected in\nthis request. Keys are entity Names (the same identifiers used in Solar.Core.Models.BaseApiRedactionRequest.CustomPiiEntityIds);\nvalues control whether the custom entity always wins an exact-boundary overlap against a\nbuilt-in entity (`Prioritized`) or is compared by score (`Standard`). Omit to keep\ntoday's behavior of treating every requested custom entity as Prioritized. Supplying a key\nthat does not match any requested custom-PII or model-based entity Name is rejected as a\n400 error.",
          "example": {
            "MY_CUSTOM_ENTITY": "Standard"
          },
          "x-nullable": true
        },
        "customEntityConfidenceThresholds": {
          "type": "object",
          "description": "Optional per-entity minimum detection confidence thresholds for custom-PII and model-based\nentities detected in this request. Keys are entity Names (the same identifiers used in\nSolar.Core.Models.BaseApiRedactionRequest.CustomPiiEntityIds); each value is in (0, 1], and detections for that entity\nwhose score falls below it are ignored. Omit to keep today's behavior of no confidence\ncutoff. Supplying a key that does not match any requested custom-PII or model-based entity\nName, or a value outside (0, 1], is rejected as a 400 error.",
          "additionalProperties": {
            "type": "number",
            "format": "double"
          },
          "example": {
            "MY_CUSTOM_ENTITY": 0.5
          },
          "x-nullable": true
        },
        "xmlText": {
          "type": "string",
          "description": "The XML document redact",
          "example": "\n            <note>\n            <to>Tove</to>\n            <from>Jani</from>\n            <heading>Reminder</heading>\n            <body>Don't forget me this weekend!</body>\n            </note>\n            "
        }
      },
      "additionalProperties": false
    }
  },
  "securityDefinitions": {
    "Apikey": {
      "type": "apiKey",
      "name": "Authorization",
      "in": "header",
      "description": "An API key generated by Tonic Structural. Example: \"Apikey {token}\""
    }
  },
  "security": [
    { }
  ],
  "tags": [
    {
      "name": "A2ADcr",
      "description": "OAuth Dynamic Client Registration (DCR) endpoint, advertised on the agent card. Per Google's A2A\nPartner Guide, Gemini Enterprise POSTs a Google-signed `software_statement` here when a buyer\nconnects the agent; we validate it, cross-reference its `google.order` against the\nPub/Sub-delivered procurement state, then create-or-return the order's per-tenant OAuth client and\nhand its credentials back — closing the onboarding loop with no human step.\n<para />`[AllowAnonymous]`: the signed statement IS the authentication (verified by\nSolar.Api.Services.A2a.IDcrSoftwareStatementValidator). The endpoint is additionally gated by the A2A\nfeature switch (`DisableA2AControllersConvention` clears its routes unless `SOLAR_API_URL`\nis configured). Repeating DCR for the same order returns the identical client_id+secret\n(M:Solar.Api.Services.A2a.IA2AOAuthClientService.CreateOrReturnDcrClientAsync(System.String,System.Collections.Generic.IReadOnlyList{System.String},System.Threading.CancellationToken)) — Gemini cannot rotate secrets."
    },
    {
      "name": "Agent Connections",
      "description": "Manage per-user external-store connections (e.g. Google Drive) used by the agent. Lists and\ndisconnects never expose tokens or other encrypted fields. Also hosts the browser-facing\nGoogle Drive connect flow. The signed single-use state token authenticates the anonymous\nconnect/callback endpoints because the clicking user typically has no Solar session."
    },
    {
      "name": "Audio",
      "description": "Transcribe and redact audio files. Start transcription jobs and retrieve results."
    },
    {
      "name": "Audit Events",
      "description": "Search and retrieve audit events related to user access, actions, and permissions within your organization."
    },
    {
      "name": "Dataset Management",
      "description": "Manage datasets for PII detection and redaction. Create, search, and edit datasets, upload and download files, and control dataset sharing permissions."
    },
    {
      "name": "Entity Types",
      "description": "Retrieve the list of built-in PII entity types that the redaction engine can detect and transform."
    },
    {
      "name": "File Redaction",
      "description": "Upload and download files for standalone redaction outside of a dataset."
    },
    {
      "name": "Groups",
      "description": "Retrieve groups within your organization."
    },
    {
      "name": "Guided Redaction Management",
      "description": "Manage guided redaction projects. Create projects, upload files, download redacted output, and control project sharing permissions."
    },
    {
      "name": "Job Logs",
      "description": "Download error logs for jobs that have failed or encountered errors."
    },
    {
      "name": "Permission Sets",
      "description": "Retrieve permission sets that define named collections of operations grantable to users and groups."
    },
    {
      "name": "RequestAuditorSettings"
    },
    {
      "name": "Synthesis",
      "description": "Group detected entities for consistent synthesis across documents."
    },
    {
      "name": "Text Redaction",
      "description": "Redact PII from text, JSON, XML, and HTML content. Supports plain text, bulk, and structured document redaction."
    },
    {
      "name": "Usage",
      "description": "Export usage reports for your organization."
    },
    {
      "name": "Users",
      "description": "Retrieve users within your organization."
    }
  ]
}