{
  "openapi": "3.0.4",
  "info": {
    "title": "Akur8 Life API",
    "version": "1.0"
  },
  "paths": {
    "/api/v1/Arrays/{arrayId}": {
      "get": {
        "tags": [
          "Arrays"
        ],
        "summary": "Get detailed information about a specific array including all values and type-specific properties.",
        "description": "This endpoint returns array details with properties varying based on the array type:\n            \n- **Static Arrays**: Returns a list of string values in order\n- **Product Output Grouping Arrays**: Returns the product output grouping ID\n- **Calculated Range Arrays**: Returns start/end/step value configurations (variable, constant, or time index)\n- **Data Table Arrays**: Returns the data table variable name and calculation level\n- **Multi-Dimensional Arrays**: Returns the IDs of both dimension arrays\n            \nThis endpoint can be used with:\n- Production models (using a Workspace or Personal token)\n- Workspace models (using a Workspace or Personal token)\n            \nThe user must have appropriate permissions to access the model containing the array.",
        "operationId": "GetArrayDetails",
        "parameters": [
          {
            "name": "arrayId",
            "in": "path",
            "description": "The unique identifier of the array to retrieve.",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "The ID of the array to retrieve",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetArrayDetailsResponse"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Arrays": {
      "post": {
        "tags": [
          "Arrays"
        ],
        "summary": "Create a new static array with the provided values.",
        "description": "This endpoint creates a new array on the specified model.\n            \nOnly the \"Static\" array source is supported at this time. Providing any other array source returns an error.\n            \nThe array name must be unique within the model and can be up to 128 characters.\nAll values must be unique and non-empty. Each value can be up to 200 characters.\nThe values are saved in the order they are provided.\n            \nThis endpoint cannot be used with production or library models.",
        "operationId": "CreateStaticArray",
        "requestBody": {
          "description": "The request containing the model ID, array name, array source, and values.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateStaticArrayRequestV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateStaticArrayRequestV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateStaticArrayRequestV1"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateStaticArrayResponseV1"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request parameters or the model does not exist",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "403": {
            "description": "The user cannot edit the model, or the model is a library model",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "409": {
            "description": "An array already exists on the model with the provided name",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Arrays/{ArrayId}/Values": {
      "put": {
        "tags": [
          "Arrays"
        ],
        "summary": "Update the values in a static array.",
        "description": "This endpoint can be used to replace all existing values in a static array.\n            \nAll values must be unique and non-empty. Each value can be up to 200 characters.",
        "operationId": "UpdateStaticArrayValues",
        "parameters": [
          {
            "name": "ArrayId",
            "in": "path",
            "description": "The ID of the static array to update.",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "The ID of the static array to update",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "The request containing the new array values.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateStaticArrayValuesRequestV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateStaticArrayValuesRequestV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateStaticArrayValuesRequestV1"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateStaticArrayValuesResponseV1"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Authorize": {
      "post": {
        "tags": [
          "Authorize"
        ],
        "summary": "Required for getting the API token which is needed to access the other endpoints.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AuthorizeParametersV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AuthorizeParametersV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AuthorizeParametersV1"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiTokenDto"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          }
        }
      }
    },
    "/api/v1/Authorize/Refresh": {
      "post": {
        "tags": [
          "Authorize"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshParametersV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshParametersV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshParametersV1"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiTokenDto"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          }
        }
      }
    },
    "/api/v2/DataTables": {
      "post": {
        "tags": [
          "DataTables"
        ],
        "summary": "Creates a new data table without a file using row data provided in the request.",
        "description": "Creates a new data table using row data provided directly in the request body.\n\n**Limits:**\n- Minimum: 1 row\n- Maximum: 100,000 rows\n- Request size: 10MB\n\n**Row Format:**\nEach row is an array of strings where values are **positional** - each position corresponds to a column in table structure order. Use empty string `\"\"` for null/empty values at any position.\n\n**Example 1:** For columns [Name (String), Age (Integer), Rate (Decimal)]:\n- `[\"John\", \"25\", \"0.05\"]` - all values\n- `[\"John\", \"\", \"0.05\"]` - Age is empty\n- `[\"\", \"25\", \"\"]` - Name and Rate are empty\n\n**Example 2:** For columns [Name (String), Scenario (ScenarioTable), Active (Boolean)]:\n- `[\"Base\", \"15\", \"true\"]` - references ScenarioTable ID 15\n- `[\"Alt\", \"\", \"true\"]` - no ScenarioTable reference (empty string)\n\n**Example 3:** For columns [Name (String), Mortality (MortalityTable), Nested (DataTable)]:\n- `[\"Row1\", \"16757\", \"499\", \"42\"]` - MortalityTable uses 2 positions, DataTable uses 1\n- `[\"Row2\", \"\", \"\", \"\"]` - all reference columns empty\n\n**Supported Column Types:**\n| Type | Values | Example |\n|------|--------|--------|\n| Integer (1) | 1 value | \"100\" |\n| Decimal (2) | 1 value | \"0.0123\" |\n| String (3) | 1 value | \"Male\" |\n| Date (4) | 1 value | \"2024-01-15\" |\n| Boolean (5) | 1 value | \"true\" or \"false\" |\n| MortalityTable (6) | **2 values** | \"16757\", \"499\" |\n| DataTable (7) | 1 value | \"42\" or \"\" |\n| DropDownList (8) | 1 value | \"Option1\" |\n| ScenarioTable (9) | 1 value | \"15\" or \"\" |\n\n**Important:**\n- MortalityTable columns expand to **2 positions** in the row array (decrementTableId, improvementScaleId)\n- All other column types use **1 position** each\n- Row length must equal: (column count) + (number of MortalityTable columns)\n- Invalid DataTable/ScenarioTable reference IDs are silently cleared to empty\n- Format matches GET /api/v1/DataTables/{id}/Data response",
        "operationId": "CreateDataTableV2",
        "requestBody": {
          "description": "Create request containing table structure, name, and row data",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateDataTableRequestV2"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateDataTableRequestV2"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateDataTableRequestV2"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Data table created successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportDataTableResponseV2"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request parameters or validation errors"
          },
          "403": {
            "description": "Forbidden - insufficient permissions"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Table structure not found"
          },
          "401": {
            "description": "Unauthorized"
          },
          "409": {
            "description": "Data table with the same name already exists for this table structure"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v2/DataTables/Import": {
      "post": {
        "tags": [
          "DataTables"
        ],
        "summary": "Creates a new data table from an imported file.",
        "description": "Creates a new data table using an existing file. This endpoint cannot be used to update existing data tables. The excel sheet name field is required for excel files and the delimiter field, which defaults to a comma if not set, is required for non-excel files. The limit for the number of rows is 25,000 for data tables that aren't file only.",
        "operationId": "ImportDataTable",
        "requestBody": {
          "description": "Import request containing table structure, name, and file reference",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImportDataTableRequestV2"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ImportDataTableRequestV2"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ImportDataTableRequestV2"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Data table created successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportDataTableResponseV2"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request parameters"
          },
          "403": {
            "description": "Forbidden - insufficient permissions"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          },
          "409": {
            "description": "Data table with the same name already exists for this table structure"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v2/DataTables/{dataTableId}/Import": {
      "put": {
        "tags": [
          "DataTables"
        ],
        "summary": "Overwrites an existing data table from an imported file.",
        "description": "Overwrites the contents of an existing data table using the specified file. Library and Production models cannot be updated using this endpoint. The excel sheet name field is required for excel files and the delimiter field, which defaults to a comma if not set, is required for non-excel files. The limit for the number of rows is 25,000 for data tables that aren't file only.",
        "operationId": "OverwriteDataTable",
        "parameters": [
          {
            "name": "dataTableId",
            "in": "path",
            "description": "The ID of the data table to overwrite",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "Import request containing file reference",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OverwriteDataTableRequestV2"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/OverwriteDataTableRequestV2"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/OverwriteDataTableRequestV2"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Data table overwritten successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportDataTableResponseV2"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request parameters or Library/Production model"
          },
          "403": {
            "description": "Forbidden - insufficient permissions"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Data table not found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v2/DataTables/{dataTableId}": {
      "patch": {
        "tags": [
          "DataTables"
        ],
        "summary": "Updates individual properties of an existing data table.",
        "description": "This endpoint cannot be used on production models. Only development models can be updated.\nIf the data table indexes are being updated and the table is used in any projections, a new version will be created automatically to preserve projection integrity.\nName-only updates do not trigger versioning.",
        "operationId": "UpdateDataTableProperties",
        "parameters": [
          {
            "name": "dataTableId",
            "in": "path",
            "description": "The ID of the data table to update",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "Update request containing optional Name and/or Indexes",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDataTableRequestV2"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDataTableRequestV2"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDataTableRequestV2"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Data table updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateDataTableResponseV2"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request parameters or no properties provided"
          },
          "403": {
            "description": "Forbidden - cannot update production models or insufficient permissions"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Data table not found"
          },
          "401": {
            "description": "Unauthorized"
          },
          "409": {
            "description": "Data table with the same name already exists for this table structure"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/DataTables/Data": {
      "get": {
        "tags": [
          "DataTables"
        ],
        "summary": "Get a data table's data.",
        "description": "Either the data table ID must be provided, or the data table's name along with its associated table structure ID must be provided. <br/>If the data table is file only, then a file path to the file along with the file version will be returned so that it can be used with the GetDownloadUrl endpoint. <br/>For other data tables the rows are returned in the response up to the limit. The default limit is 2,000 and the max limit is 10,000. <br/>If the row limit is reached, then an offset is returned that can be used in a subsequent request to get the next set of rows. <br/>The response includes the TableStructureId of the table structure the data table is a part of, even when the requested data table is not the latest version.",
        "operationId": "GetDataTableData",
        "parameters": [
          {
            "name": "DataTableId",
            "in": "query",
            "description": "Data Table ID",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Name",
            "in": "query",
            "description": "Data Table Name",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Version",
            "in": "query",
            "description": "Data Table Version",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "TableStructureId",
            "in": "query",
            "description": "Table Structure ID",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetDataTableResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/DataTables": {
      "patch": {
        "tags": [
          "DataTables"
        ],
        "summary": "Update a data table using an existing file.",
        "description": "This endpoint has the same limitations mentioned in the create data table POST endpoint. <br/>In addition, be aware that a successful request might cause the table to be versioned, thus returning a new data table id that represents the versioned table. <br/>A table will be versioned if it's been used in a projection since the last time it was modified.",
        "operationId": "UpdateDataTable",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDataTableRequestV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDataTableRequestV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDataTableRequestV1"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateOrUpdateDataTableResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/DataTables/{DataTableId}/Data": {
      "put": {
        "tags": [
          "DataTables"
        ],
        "summary": "Update a data table's row data without uploading a file.",
        "description": "Pass row data directly to update the data table without needing to upload a file first. Rows should be formatted as arrays of string values matching the column order from the GET /Data endpoint. Index columns come first (sorted by SortOrder), then data columns (sorted by SortOrder). For MortalityTable columns, pass two values: DecrementTableId and ImprovementScaleId. Maximum of 100,000 rows. Note: There is also a 10MB request size limit. A successful request might cause the table to be versioned if it has been used in a projection since the last modification.",
        "operationId": "UpdateDataTableData",
        "parameters": [
          {
            "name": "DataTableId",
            "in": "path",
            "description": "The ID of the data table to update.",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Data Table Id",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "The row data to replace existing data.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDataTableDataRequestV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDataTableDataRequestV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDataTableDataRequestV1"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Data table data updated successfully.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateDataTableDataResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request (file-only table, validation errors, row limit exceeded)."
          },
          "403": {
            "description": "Cannot update data tables on production models or no model access."
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Data table not found."
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/DecrementTables/{DecrementTableId}": {
      "get": {
        "tags": [
          "DecrementTables"
        ],
        "summary": "Get a decrement table.",
        "operationId": "GetDecrementTableById",
        "parameters": [
          {
            "name": "DecrementTableId",
            "in": "path",
            "description": "Decrement Table Id",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Decrement Table Id",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetDecrementTableResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "DecrementTables"
        ],
        "summary": "Delete a decrement table.",
        "operationId": "DeleteDecrementTableById",
        "parameters": [
          {
            "name": "DecrementTableId",
            "in": "path",
            "description": "Decrement Table Id",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Decrement Table Id",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/DecrementTables": {
      "post": {
        "tags": [
          "DecrementTables"
        ],
        "summary": "Create a decrement table using an existing file.",
        "operationId": "CreateDecrementTable",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateDecrementTableRequestV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateDecrementTableRequestV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateDecrementTableRequestV1"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateOrUpdateDecrementTableResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          },
          "409": {
            "description": "Decrement table name already exists"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Files/GetFiles": {
      "get": {
        "tags": [
          "Files"
        ],
        "summary": "Get all currently available latest-version files.",
        "operationId": "GetFiles",
        "parameters": [
          {
            "name": "Folders",
            "in": "query",
            "description": "Optional parameter to filter files to specific folders. The list must be in CSV format. If folder contains a comma, make sure to surround it with double quotes. Example: folder1,folder2,\"folder,3\"",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetFilesResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Files/GetDownloadUrl": {
      "post": {
        "tags": [
          "Files"
        ],
        "summary": "Get a temporary URL to download a file.",
        "operationId": "GetDownloadUrl",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FilePathAndVersionDtoV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/FilePathAndVersionDtoV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/FilePathAndVersionDtoV1"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetDownloadUrlResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Files/GetUploadUrl": {
      "post": {
        "tags": [
          "Files"
        ],
        "summary": "Get a temporary URL to upload a file to a certain file path via a PUT request with the file data.",
        "description": "Passing in the ContentType and ContentMD5 values is optional. If provided, they will be included in the signature, but are not stored at this point. <br/><br/>Exclude the <i>'Content-Type'</i> header from the PUT request if this is not set. <br/>If included, the <i>'Content-Type'</i> header in the PUT request must match the provided ContentType value. <br/><br/>Exclude the <i>'ContentMD5'</i> header from the PUT request if this is not set. <br/>If included, the <i>'Content-MD5'</i> header in the PUT request must match the provided ContentMD5 value. <br/><br/><b>NOTE:</b> There is a 5GB limit on the size of the file.",
        "operationId": "GetUploadUrl",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetUploadUrlFilePathDtoV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetUploadUrlFilePathDtoV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetUploadUrlFilePathDtoV1"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetUploadUrlResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Files/SaveUpload": {
      "post": {
        "tags": [
          "Files"
        ],
        "summary": "Save the file that was uploaded via the upload url returned by the GetUploadUrl endpoint.",
        "operationId": "SaveUpload",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveUploadFilePathDtoV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveUploadFilePathDtoV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SaveUploadFilePathDtoV1"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SaveUploadResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/ImprovementScales/{ImprovementScaleId}": {
      "get": {
        "tags": [
          "ImprovementScales"
        ],
        "summary": "Get an improvement scale.",
        "operationId": "GetImprovementScaleById",
        "parameters": [
          {
            "name": "ImprovementScaleId",
            "in": "path",
            "description": "Improvement Scale ID",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Improvement Scale ID",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetImprovementScaleResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/ImprovementScales": {
      "post": {
        "tags": [
          "ImprovementScales"
        ],
        "summary": "Create an improvement scale using an existing file.",
        "operationId": "CreateImprovementScale",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateImprovementScaleRequestV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateImprovementScaleRequestV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateImprovementScaleRequestV1"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateOrUpdateImprovementScaleResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          },
          "409": {
            "description": "Improvement scale name already exists"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/ModelPointFields": {
      "post": {
        "tags": [
          "ModelPointFields"
        ],
        "summary": "Create a new model point field for a product.",
        "description": "This endpoint will:\n- Validate the user has permission to modify the model\n- Ensure the model is not in production\n- Validate field name and alias uniqueness\n- Validate data type rules (e.g., only Decimal fields can scale)\n- Trigger validation on dependent entities\n- Initiate async file validation\n\nField names and aliases must be unique within the product's model point file definition.\nOnly Decimal fields can be configured to scale on purchase or sale.",
        "operationId": "CreateModelPointField",
        "requestBody": {
          "description": "The model point field creation request.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateModelPointFieldRequestV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateModelPointFieldRequestV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateModelPointFieldRequestV1"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateModelPointFieldResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/ModelPointFields/{modelPointFieldId}": {
      "delete": {
        "tags": [
          "ModelPointFields"
        ],
        "summary": "Delete a model point field by its ID.",
        "description": "This endpoint will:\n- Validate the user has permission to modify the model\n- Ensure the model is not in production\n- Prevent deletion of system model point fields (e.g., Issue Date)\n- Trigger validation on dependent entities\n- Initiate async file validation\n\nOnly one model point field can be deleted at a time.",
        "operationId": "DeleteModelPointField",
        "parameters": [
          {
            "name": "modelPointFieldId",
            "in": "path",
            "description": "The ID of the model point field to delete.",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "The ID of the model point field to delete",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      },
      "patch": {
        "tags": [
          "ModelPointFields"
        ],
        "summary": "Update an existing model point field.",
        "description": "This endpoint will:\n- Validate the user has permission to modify the model\n- Ensure the model is not in production\n- Support partial updates (only send fields to be updated)\n- Validate field name and alias uniqueness\n- Enforce system field restrictions (cannot update DataType, IsRequired, or IsScaledOnPurchaseOrSale for system fields)\n- Validate data type rules (e.g., only Decimal fields can scale)\n- Prevent changing DataType to non-Decimal when IsScaledOnPurchaseOrSale is true\n- Trigger validation on model point files when critical properties change\n\nFor system model point fields, the Data Type, IsRequired flag, and Scales on Purchase or Sale flag cannot be updated.\nField names and aliases must remain unique within the product's model point file definition.",
        "operationId": "UpdateModelPointField",
        "parameters": [
          {
            "name": "modelPointFieldId",
            "in": "path",
            "description": "The ID of the model point field to update.",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "The ID of the model point field to update",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "The model point field update request with partial update support.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateModelPointFieldRequestV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateModelPointFieldRequestV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateModelPointFieldRequestV1"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateModelPointFieldResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Models": {
      "get": {
        "tags": [
          "Models"
        ],
        "summary": "Get a paginated list of models by type (Library, Workspace, or Production).",
        "operationId": "ListModels",
        "parameters": [
          {
            "name": "ModelType",
            "in": "query",
            "description": "Type of models to retrieve: Library, Workspace, or Production",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/ModelTypeFilter"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseListModelsResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Models/{ModelId}/ProjectionTemplates": {
      "get": {
        "tags": [
          "Models"
        ],
        "summary": "Get model's projection templates.",
        "operationId": "GetProjectionTemplatesByModelId",
        "parameters": [
          {
            "name": "ModelId",
            "in": "path",
            "description": "Model Id",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Model Id",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetModelProjectionTemplatesResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Models/{ModelId}/DataTables": {
      "get": {
        "tags": [
          "Models"
        ],
        "summary": "Get model's data tables.",
        "operationId": "GetDataTablesByModelId",
        "parameters": [
          {
            "name": "ModelId",
            "in": "path",
            "description": "Model Id",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Model Id",
              "format": "int32"
            }
          },
          {
            "name": "TableStructureName",
            "in": "query",
            "description": "Optional Table Structure Name filter",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetModelDataTablesResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Models/{ModelId}/DecrementTables": {
      "get": {
        "tags": [
          "Models"
        ],
        "summary": "Get model's decrement tables.",
        "operationId": "GetDecrementTablesByModelId",
        "parameters": [
          {
            "name": "ModelId",
            "in": "path",
            "description": "Model Id",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Model Id",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetModelDecrementTablesResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Models/{ModelId}/ScenarioTables": {
      "get": {
        "tags": [
          "Models"
        ],
        "summary": "Get model's scenario tables.",
        "operationId": "GetScenarioTablesByModelId",
        "parameters": [
          {
            "name": "ModelId",
            "in": "path",
            "description": "Model Id",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Model Id",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetModelScenarioTablesResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Models/{ModelId}/ImprovementScales": {
      "get": {
        "tags": [
          "Models"
        ],
        "summary": "Get model's improvement scales.",
        "operationId": "GetImprovementScalesByModelId",
        "parameters": [
          {
            "name": "ModelId",
            "in": "path",
            "description": "Model Id",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Model Id",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetModelImprovementScalesResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Models/{ModelId}/TableStructures": {
      "get": {
        "tags": [
          "Models"
        ],
        "summary": "Get model's table structures.",
        "operationId": "GetTableStructuresByModelId",
        "parameters": [
          {
            "name": "ModelId",
            "in": "path",
            "description": "Model Id",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Model Id",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetModelTableStructuresResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Models/{ModelId}/InvestmentStrategies": {
      "get": {
        "tags": [
          "Models"
        ],
        "summary": "Get model's investment strategies.",
        "operationId": "GetInvestmentStrategiesByModelId",
        "parameters": [
          {
            "name": "ModelId",
            "in": "path",
            "description": "Model Id",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Model Id",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetModelInvestmentStrategiesResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Models/{ModelId}/Products": {
      "get": {
        "tags": [
          "Models"
        ],
        "summary": "Get model's products.",
        "operationId": "GetProductsByModelId",
        "parameters": [
          {
            "name": "ModelId",
            "in": "path",
            "description": "Model Id",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Model Id",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetModelProductsResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Models/{ModelId}/ProductOutputGroupings": {
      "get": {
        "tags": [
          "Models"
        ],
        "summary": "Get model's product output groupings.",
        "description": "Library models are not supported and return a 403.",
        "operationId": "GetProductOutputGroupingsByModelId",
        "parameters": [
          {
            "name": "ModelId",
            "in": "path",
            "description": "Model Id",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Model Id",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetModelProductOutputGroupingsResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Models/{ModelId}/VariableRates": {
      "get": {
        "tags": [
          "Models"
        ],
        "summary": "Get model's variable rates.",
        "operationId": "GetVariableRatesByModelId",
        "parameters": [
          {
            "name": "ModelId",
            "in": "path",
            "description": "Model Id",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Model Id",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetModelVariableRatesResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Models/{ModelId}/Copy": {
      "post": {
        "tags": [
          "Models"
        ],
        "summary": "Initiate an asynchronous copy of a model. Returns a token to check copy status.",
        "description": "Creates a full copy of the specified model. The copy is performed asynchronously in the background. Use the returned copy token to check the status of the copy operation. Note: Copy tokens are only valid for 24 hours after the copy is initiated. Library models cannot be copied in this version.",
        "operationId": "CopyModel",
        "parameters": [
          {
            "name": "ModelId",
            "in": "path",
            "description": "The ID of the model to copy",
            "required": true,
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "description": "The ID of the model to copy",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CopyModelRequestV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CopyModelRequestV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CopyModelRequestV1"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CopyModelResponseV1"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Forbidden"
          },
          "404": {
            "description": "Not Found"
          },
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Models/CopyStatus/{Token}": {
      "get": {
        "tags": [
          "Models"
        ],
        "summary": "Check the status of an asynchronous model copy operation.",
        "description": "Returns the current status of a model copy operation initiated via the Copy endpoint. The status can be Running, Completed, or Failed. When completed, the response includes the ID of the newly created model. When failed, the response includes an error message. Note: Copy tokens are only valid for 24 hours.",
        "operationId": "GetModelCopyStatus",
        "parameters": [
          {
            "name": "Token",
            "in": "path",
            "description": "The copy token returned from the Copy endpoint",
            "required": true,
            "schema": {
              "type": "string",
              "description": "The copy token returned from the Copy endpoint"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModelCopyStatusResponseV1"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Models/{ModelId}/Arrays": {
      "get": {
        "tags": [
          "Models"
        ],
        "summary": "Get model's arrays.",
        "operationId": "GetArraysByModelId",
        "parameters": [
          {
            "name": "ModelId",
            "in": "path",
            "description": "Model Id",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Model Id",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetModelArraysResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Products/{ProductId}/ModelPointFields": {
      "get": {
        "tags": [
          "Products"
        ],
        "summary": "Get all model point fields for a product.",
        "description": "This endpoint will:\n- Validate the user has permission to view the model\n- Return all model point fields for the specified product\n- Support pagination with offset and limit\n- Support field filtering via the Fields parameter\n- Include Field Name, Field ID, Description, Data Type, IsRequired flag, Scales flags, Default values, and Aliases",
        "operationId": "GetModelPointFields",
        "parameters": [
          {
            "name": "ProductId",
            "in": "path",
            "description": "The ID of the product to get model point fields for.",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "The ID of the product to get model point fields for",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetModelPointFieldsResponseItemV1"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetModelPointFieldsResponseItemV1"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetModelPointFieldsResponseItemV1"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Projections": {
      "get": {
        "tags": [
          "Projections"
        ],
        "summary": "Get a paginated list of projections in the workspace.",
        "description": "Returns projections accessible to the current user. Workspace API tokens see all projections; Personal API tokens only see projections for models the user has access to.",
        "operationId": "ListProjections",
        "parameters": [
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseListProjectionsResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Projections"
        ],
        "summary": "Create a projection using an existing projection template.",
        "operationId": "CreateProjectionFromTemplate",
        "parameters": [
          {
            "name": "TemplateId",
            "in": "query",
            "description": "Template ID",
            "schema": {
              "type": "integer",
              "description": "Template ID",
              "format": "int32"
            }
          },
          {
            "name": "Name",
            "in": "query",
            "description": "Projection Name",
            "schema": {
              "type": "string",
              "description": "Projection Name"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateProjectionFromTemplateRequestV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateProjectionFromTemplateRequestV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateProjectionFromTemplateRequestV1"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateProjectionFromTemplateResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Projections/{projectionId}": {
      "get": {
        "tags": [
          "Projections"
        ],
        "summary": "Get Projection Details by Id.",
        "operationId": "GetProjectionById",
        "parameters": [
          {
            "name": "projectionId",
            "in": "path",
            "description": "Projection ID",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Projection ID",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. The list must be in CSV format.\nExample: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetProjectionResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      },
      "patch": {
        "tags": [
          "Projections"
        ],
        "summary": "Update projection properties.",
        "description": "Validating model point files is limited to 100K rows with 20 columns.<br/><b>For larger model point files set ValidateModelPointFiles to false.</b>",
        "operationId": "UpdateExistingProjection",
        "parameters": [
          {
            "name": "projectionId",
            "in": "path",
            "description": "Projection ID",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Projection ID",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProjectionRequestV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProjectionRequestV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProjectionRequestV1"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetProjectionResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Projections/{projectionId}/Portfolios": {
      "get": {
        "tags": [
          "Projections"
        ],
        "summary": "Get the portfolios configured on a projection.",
        "operationId": "GetProjectionPortfolios",
        "parameters": [
          {
            "name": "projectionId",
            "in": "path",
            "description": "Projection ID",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Projection ID",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetProjectionPortfoliosResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Projections/{projectionId}/Run": {
      "post": {
        "tags": [
          "Projections"
        ],
        "summary": "Start a projection run.",
        "operationId": "RunProjectionById",
        "parameters": [
          {
            "name": "projectionId",
            "in": "path",
            "description": "Projection ID",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Projection ID",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Projections/{projectionId}/Unarchive": {
      "post": {
        "tags": [
          "Projections"
        ],
        "summary": "Unarchive a projection.",
        "description": "Starts loading the projection's results back and returns without waiting for it. Poll GET Projections/{projectionId} to follow its archivalStatus. Unarchiving a projection that is not archived does nothing and succeeds. A projection reads as archived as soon as its archive starts, but cannot be unarchived until that archive finishes (400).",
        "operationId": "UnarchiveProjectionById",
        "parameters": [
          {
            "name": "projectionId",
            "in": "path",
            "description": "Projection ID",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Projection ID",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnarchiveProjectionResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Projections/Portfolios/{portfolioId}/Products": {
      "get": {
        "tags": [
          "Projections"
        ],
        "summary": "Get the products configured on a projection's portfolio.",
        "description": "Model point file filters and additional fields are not included.",
        "operationId": "GetProjectionPortfolioProducts",
        "parameters": [
          {
            "name": "portfolioId",
            "in": "path",
            "description": "Portfolio ID on the projection",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Portfolio ID on the projection",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetProjectionPortfolioProductsResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Projections"
        ],
        "summary": "Add a new product to a portfolio on a projection.",
        "operationId": "AddProductToPortfolio",
        "parameters": [
          {
            "name": "portfolioId",
            "in": "path",
            "description": "Portfolio ID on the projection",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Portfolio ID on the projection",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddProductToPortfolioRequestV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AddProductToPortfolioRequestV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AddProductToPortfolioRequestV1"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AddProductToPortfolioResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Projections/{projectionId}/Copy": {
      "post": {
        "tags": [
          "Projections"
        ],
        "summary": "Copies a projection.",
        "description": "SetTablesToLatestVersion will default to True if omitted.<br/>ProjectionName will default to the copied projection's name if omitted.",
        "operationId": "CopyProjection",
        "parameters": [
          {
            "name": "projectionId",
            "in": "path",
            "description": "Projection ID",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Projection ID",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CopyProjectionRequestV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CopyProjectionRequestV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CopyProjectionRequestV1"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CopyProjectionResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Projections/Portfolios/Products/{productId}": {
      "delete": {
        "tags": [
          "Projections"
        ],
        "summary": "Remove a product from a projection's portfolio.",
        "operationId": "DeletePortfolioProduct",
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "description": "Product ID",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Product ID",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Reports/Workbooks/{workbookId}/Generate": {
      "post": {
        "tags": [
          "Reports"
        ],
        "summary": "Start a workbook report generation. Use the returned URL to check the status of the report generation.",
        "operationId": "GenerateWorkbookReport",
        "parameters": [
          {
            "name": "workbookId",
            "in": "path",
            "description": "Workbook ID",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Workbook ID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GenerateWorkbookReportRequestV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GenerateWorkbookReportRequestV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GenerateWorkbookReportRequestV1"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenerateWorkbookReportResponseV1"
                }
              }
            }
          },
          "200": {
            "description": "Success"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Reports/Workbooks/Status/{generationId}": {
      "get": {
        "tags": [
          "Reports"
        ],
        "summary": "Get workbook report generation status. If successful, then a URL will be available to download the report.",
        "operationId": "GetWorkbookReportGenerationStatus",
        "parameters": [
          {
            "name": "generationId",
            "in": "path",
            "description": "Generation ID",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Generation ID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetWorkbookReportGenerationStatusResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/ScenarioTables/{ScenarioTableId}": {
      "get": {
        "tags": [
          "ScenarioTables"
        ],
        "summary": "Get a scenario table.",
        "operationId": "GetScenarioTableById",
        "parameters": [
          {
            "name": "ScenarioTableId",
            "in": "path",
            "description": "Scenario Table Id",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Scenario Table Id",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetScenarioTableResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      },
      "patch": {
        "tags": [
          "ScenarioTables"
        ],
        "summary": "Update a scenario table.",
        "description": "The excel sheet name field is required for excel files and the delimiter field, which defaults to a comma if not set, is required for non-excel files. <br/>The row limit is 150,000 for excel files and 2 million for csv files. <br/>To avoid request timeouts on large files, set validateFile to false to skip validation on upload; the file will then be validated when a projection is run.",
        "operationId": "UpdateExistingScenarioTable",
        "parameters": [
          {
            "name": "ScenarioTableId",
            "in": "path",
            "description": "Scenario Table Id",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Scenario Table Id",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateScenarioTableRequestV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateScenarioTableRequestV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateScenarioTableRequestV1"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateOrUpdateScenarioTableResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          },
          "409": {
            "description": "Scenario table description already exists"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/ScenarioTables": {
      "post": {
        "tags": [
          "ScenarioTables"
        ],
        "summary": "Create a scenario table using an existing file.",
        "description": "The excel sheet name field is required for excel files and the delimiter field, which defaults to a comma if not set, is required for non-excel files. <br/>The row limit is 150,000 for excel files and 2 million for csv files. <br/>To avoid request timeouts on large files, set validateFile to false to skip validation on upload; the file will then be validated when a projection is run.",
        "operationId": "CreateScenarioTableFromFile",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateScenarioTableRequestV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateScenarioTableRequestV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateScenarioTableRequestV1"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateOrUpdateScenarioTableResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          },
          "409": {
            "description": "Scenario table description already exists"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/ScenarioTables/Generate": {
      "post": {
        "tags": [
          "ScenarioTables"
        ],
        "summary": "Generate a scenario table from a generator.",
        "operationId": "GenerateScenarioTableFromGenerator",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GenerateScenarioTableRequestV1"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GenerateScenarioTableRequestV1"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GenerateScenarioTableRequestV1"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenerateScenarioTableResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/ScenarioTables/Generate/Status/{generationId}": {
      "get": {
        "tags": [
          "ScenarioTables"
        ],
        "summary": "Get the status of a scenario table generation.",
        "operationId": "GetGenerateStatus",
        "parameters": [
          {
            "name": "generationId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenerateScenarioTableStatusResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/TableStructures/{TableStructureId}": {
      "get": {
        "tags": [
          "TableStructures"
        ],
        "summary": "Get a table structure by id.",
        "operationId": "GetTableStructureById",
        "parameters": [
          {
            "name": "TableStructureId",
            "in": "path",
            "description": "Table Structure Id",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Table Structure Id",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetTableStructureResponseV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/TableStructures/{TableStructureId}/DataTables": {
      "get": {
        "tags": [
          "TableStructures"
        ],
        "summary": "Get a list of Data Tables given a Table Structure Id",
        "operationId": "GetDataTablesByTableStructureId",
        "parameters": [
          {
            "name": "TableStructureId",
            "in": "path",
            "description": "Table Structure ID",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Table Structure ID",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetTableStructureDataTablesResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/TableStructures/{TableStructureId}/Columns": {
      "get": {
        "tags": [
          "TableStructures"
        ],
        "summary": "Get a list of Columns given a Table Structure Id",
        "operationId": "GetColumnsByTableStructureId",
        "parameters": [
          {
            "name": "TableStructureId",
            "in": "path",
            "description": "Table Structure ID",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Table Structure ID",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseGetTableStructureColumnsResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    },
    "/api/v1/Users": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Get a paginated list of users.",
        "description": "Possible status values: Locked (account has been locked), Activated (user has logged in at least once), Invited (invited but has not yet verified their email), Pending login (verified email but has not yet logged in).",
        "parameters": [
          {
            "name": "Limit",
            "in": "query",
            "description": "Optional parameter to limit the number of items returned. Default is 200 and the max is 200.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Fields",
            "in": "query",
            "description": "Optional parameter to filter the top-level fields that are returned. \nThe list must be in CSV format. Example: field1,field2,field3",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Offset",
            "in": "query",
            "description": "Optional parameter to offset the items returned. Default is 0.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetUsersResponseItemV1"
                }
              }
            }
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Not Allowed To Access"
          },
          "429": {
            "description": "Too Many Requests"
          },
          "404": {
            "description": "Not Found"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "API Token": [ ]
          }
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "AddProductFilterRequestV1": {
        "required": [
          "field",
          "value"
        ],
        "type": "object",
        "properties": {
          "field": {
            "minLength": 1,
            "type": "string",
            "description": "Model Point Field Name"
          },
          "value": {
            "minLength": 1,
            "type": "string",
            "description": "Filter Value"
          }
        },
        "additionalProperties": false
      },
      "AddProductModelPointFileRequestV1": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "integer",
            "description": "File ID",
            "format": "int32",
            "nullable": true
          },
          "filePath": {
            "type": "string",
            "description": "File Path",
            "nullable": true
          },
          "fileVersion": {
            "type": "integer",
            "description": "File Version",
            "format": "int32",
            "nullable": true
          },
          "delimiter": {
            "type": "string",
            "description": "Delimiter (max 2 characters)",
            "nullable": true
          },
          "excelSheetName": {
            "type": "string",
            "description": "Excel Sheet Name",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AddProductToPortfolioRequestV1": {
        "required": [
          "name",
          "productId"
        ],
        "type": "object",
        "properties": {
          "productId": {
            "type": "integer",
            "description": "Product ID from the model",
            "format": "int32"
          },
          "name": {
            "maxLength": 128,
            "minLength": 0,
            "type": "string",
            "description": "Product Name"
          },
          "modelPointFile": {
            "$ref": "#/components/schemas/AddProductModelPointFileRequestV1"
          },
          "filters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AddProductFilterRequestV1"
            },
            "description": "Model Point Filters",
            "nullable": true
          },
          "productOutputGroupings": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Product Output Grouping IDs",
            "nullable": true
          }
        },
        "additionalProperties": { }
      },
      "AddProductToPortfolioResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ApiTokenDto": {
        "type": "object",
        "properties": {
          "accessToken": {
            "type": "string",
            "nullable": true
          },
          "expiresIn": {
            "type": "integer",
            "format": "int64"
          },
          "refreshToken": {
            "type": "string",
            "format": "uuid"
          },
          "expires": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ArrayType": {
        "enum": [
          "Static",
          "ProductOutputGrouping",
          "Range",
          "DataTable",
          "MultiDimensional",
          "List"
        ],
        "type": "string"
      },
      "ArrayValueItemV1": {
        "required": [
          "value"
        ],
        "type": "object",
        "properties": {
          "value": {
            "maxLength": 200,
            "minLength": 0,
            "type": "string",
            "description": "The value for the array item. Maximum 200 characters."
          }
        },
        "additionalProperties": false
      },
      "AuthorizeParametersV1": {
        "type": "object",
        "properties": {
          "apiKey": {
            "type": "string",
            "format": "uuid"
          },
          "apiSecretKey": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false
      },
      "CalculationType": {
        "enum": [
          "Product",
          "Portfolio",
          "Company"
        ],
        "type": "string"
      },
      "CopyModelRequestV1": {
        "required": [
          "folderPath",
          "newModelName"
        ],
        "type": "object",
        "properties": {
          "newModelName": {
            "maxLength": 128,
            "minLength": 1,
            "type": "string",
            "description": "The name for the new copied model"
          },
          "folderPath": {
            "minLength": 1,
            "type": "string",
            "description": "The folder path where the copied model should be placed.\nUse folder names as displayed in the UI (e.g., \"/Top Folder/Sub-Folder\").\nUse \"/\" or null for the root folder.",
            "example": "string"
          }
        },
        "additionalProperties": false
      },
      "CopyModelResponseV1": {
        "type": "object",
        "properties": {
          "copyToken": {
            "type": "string",
            "description": "Token used to check the status of the copy operation",
            "nullable": true
          },
          "statusUrl": {
            "type": "string",
            "description": "URL to poll for copy operation status",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CopyProjectionRequestV1": {
        "type": "object",
        "properties": {
          "projectionName": {
            "type": "string",
            "nullable": true
          },
          "setTablesToLatestVersion": {
            "type": "boolean"
          }
        },
        "additionalProperties": { }
      },
      "CopyProjectionResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CreateDataTableRequestV2": {
        "required": [
          "name",
          "rows",
          "tableStructureId"
        ],
        "type": "object",
        "properties": {
          "tableStructureId": {
            "type": "integer",
            "description": "Table Structure ID (required)",
            "format": "int32",
            "example": 1
          },
          "name": {
            "maxLength": 200,
            "minLength": 0,
            "type": "string",
            "description": "Data Table Name (required)",
            "example": "2024 Mortality Assumptions"
          },
          "rows": {
            "maxItems": 100000,
            "minItems": 1,
            "type": "array",
            "items": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Table rows as a 2D array of string values. Values are positional - each position\ncorresponds to a column in table structure order. Use empty string \"\" for null/empty values.",
            "example": [
              [
                "100",
                "Male",
                "0.0123",
                "2024-01-15",
                "true",
                "16757",
                "499",
                "42",
                "Option1",
                "15"
              ],
              [
                "101",
                "Female",
                "0.0098",
                "2024-02-20",
                "false",
                "16758",
                "500",
                "",
                "Option2",
                ""
              ]
            ]
          },
          "indexes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DataTableIndexRequestV2"
            },
            "description": "Optional list of column indexes for table lookup optimization",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request model for creating a data table without a file"
      },
      "CreateDecrementTableRequestV1": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "integer",
            "description": "File ID",
            "format": "int32",
            "nullable": true
          },
          "filePath": {
            "type": "string",
            "description": "File Path",
            "nullable": true
          },
          "fileVersion": {
            "type": "integer",
            "description": "File Version",
            "format": "int32",
            "nullable": true
          },
          "delimiter": {
            "type": "string",
            "description": "Delimiter",
            "nullable": true
          },
          "excelSheetName": {
            "type": "string",
            "description": "Excel Sheet Name",
            "nullable": true
          },
          "modelId": {
            "type": "integer",
            "description": "Model ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Decrement Table Name",
            "nullable": true
          },
          "decrementTableType": {
            "$ref": "#/components/schemas/MortalityTableType"
          },
          "improvementBaseYear": {
            "type": "integer",
            "description": "Improvement Base Year",
            "format": "int32",
            "nullable": true
          },
          "selectPeriodFrequency": {
            "$ref": "#/components/schemas/SelectPeriodFrequencyType"
          }
        },
        "additionalProperties": false
      },
      "CreateImprovementScaleRequestV1": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "integer",
            "description": "File ID",
            "format": "int32",
            "nullable": true
          },
          "filePath": {
            "type": "string",
            "description": "File Path",
            "nullable": true
          },
          "fileVersion": {
            "type": "integer",
            "description": "File Version",
            "format": "int32",
            "nullable": true
          },
          "delimiter": {
            "type": "string",
            "description": "Delimiter",
            "nullable": true
          },
          "excelSheetName": {
            "type": "string",
            "description": "Excel Sheet Name",
            "nullable": true
          },
          "modelId": {
            "type": "integer",
            "description": "Model ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Improvement Scale Name",
            "nullable": true
          },
          "improvementScaleType": {
            "$ref": "#/components/schemas/ImprovementScaleType"
          }
        },
        "additionalProperties": false
      },
      "CreateModelPointFieldRequestV1": {
        "required": [
          "dataType",
          "isRequired",
          "isScaledOnPurchaseOrSale",
          "name",
          "productId"
        ],
        "type": "object",
        "properties": {
          "productId": {
            "type": "integer",
            "description": "The ID of the product to add the model point field to.",
            "format": "int32"
          },
          "name": {
            "maxLength": 64,
            "minLength": 0,
            "type": "string",
            "description": "The name of the model point field. Must be unique within the product."
          },
          "description": {
            "maxLength": 2000,
            "minLength": 0,
            "type": "string",
            "description": "An optional description of the model point field, such as expected values or formats.",
            "nullable": true
          },
          "dataType": {
            "$ref": "#/components/schemas/FieldDataType"
          },
          "isRequired": {
            "type": "boolean",
            "description": "Whether the field is required in model point files."
          },
          "isScaledOnPurchaseOrSale": {
            "type": "boolean",
            "description": "Whether the field scales on purchase or sale. Only applicable to Decimal fields."
          },
          "defaultValueSource": {
            "$ref": "#/components/schemas/ModelPointFieldDefaultMethodType"
          },
          "defaultValue": {
            "type": "string",
            "description": "The default value when DefaultMethodType is DefinedValue.",
            "nullable": true
          },
          "aliases": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Alternative names for this field. Must be unique within the product.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request model for creating a new model point field."
      },
      "CreateModelPointFieldResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "The ID of the newly created model point field.",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "The name of the newly created model point field.",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "The description of the newly created model point field, if one was provided.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Response model for model point field creation."
      },
      "CreateOrUpdateDataTableResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "tableStructureId": {
            "type": "integer",
            "format": "int32"
          },
          "tableStructureName": {
            "type": "string",
            "nullable": true
          },
          "isFileOnly": {
            "type": "boolean"
          },
          "version": {
            "type": "integer",
            "format": "int32"
          },
          "isLatestVersion": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "CreateOrUpdateDecrementTableResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Decrement Table ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Decrement Table Name",
            "nullable": true
          },
          "type": {
            "$ref": "#/components/schemas/MortalityTableType"
          },
          "version": {
            "type": "integer",
            "description": "Decrement Table Version",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "CreateOrUpdateImprovementScaleResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Improvement Scale ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Improvement Scale Name",
            "nullable": true
          },
          "type": {
            "$ref": "#/components/schemas/ImprovementScaleType"
          },
          "version": {
            "type": "integer",
            "description": "Improvement Scale Version",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "CreateOrUpdateScenarioTableResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Scenario Table ID",
            "format": "int32"
          },
          "modelId": {
            "type": "integer",
            "description": "Model ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Scenario Table Name",
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "description": "Start Date",
            "format": "date-time"
          },
          "filePath": {
            "type": "string",
            "description": "File Path",
            "nullable": true
          },
          "version": {
            "type": "integer",
            "description": "Version",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "CreateProjectionFromTemplateRequestV1": {
        "type": "object",
        "properties": {
          "templateId": {
            "type": "integer",
            "description": "Template ID",
            "format": "int32",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Projection Name",
            "nullable": true
          }
        },
        "additionalProperties": { }
      },
      "CreateProjectionFromTemplateResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CreateScenarioTableRequestV1": {
        "required": [
          "name",
          "startDate"
        ],
        "type": "object",
        "properties": {
          "fileId": {
            "type": "integer",
            "description": "File ID",
            "format": "int32",
            "nullable": true
          },
          "filePath": {
            "type": "string",
            "description": "File Path",
            "nullable": true
          },
          "fileVersion": {
            "type": "integer",
            "description": "File Version",
            "format": "int32",
            "nullable": true
          },
          "delimiter": {
            "type": "string",
            "description": "Delimiter",
            "nullable": true
          },
          "excelSheetName": {
            "type": "string",
            "description": "Excel Sheet Name",
            "nullable": true
          },
          "modelId": {
            "type": "integer",
            "description": "Model ID",
            "format": "int32"
          },
          "name": {
            "minLength": 1,
            "type": "string",
            "description": "Scenario Table Name"
          },
          "startDate": {
            "minLength": 1,
            "type": "string",
            "description": "Scenario Start Date"
          },
          "yieldCurveRateType": {
            "$ref": "#/components/schemas/YieldCurveRateType"
          },
          "shortTermInterpolationMethod": {
            "$ref": "#/components/schemas/ShortTermInterpolationMethod"
          },
          "validateFile": {
            "type": "boolean",
            "description": "Validate the uploaded file. Defaults to true. Set to false to skip validation on upload and avoid request\ntimeouts for large files; the file will instead be validated when a projection is run.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CreateStaticArrayRequestV1": {
        "required": [
          "arraySource",
          "name",
          "values"
        ],
        "type": "object",
        "properties": {
          "modelId": {
            "type": "integer",
            "description": "The ID of the model to create the array on.",
            "format": "int32"
          },
          "name": {
            "maxLength": 128,
            "minLength": 0,
            "type": "string",
            "description": "The name of the array. Maximum 128 characters. Must be unique within the model."
          },
          "arraySource": {
            "minLength": 1,
            "type": "string",
            "description": "The array source. Only \"Static\" is supported at this time."
          },
          "values": {
            "minItems": 1,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ArrayValueItemV1"
            },
            "description": "The list of values for the static array, in the order they should be saved."
          }
        },
        "additionalProperties": false
      },
      "CreateStaticArrayResponseV1": {
        "type": "object",
        "properties": {
          "arrayId": {
            "type": "integer",
            "description": "The ID of the newly created array",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "The name of the newly created array",
            "nullable": true
          },
          "values": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The list of array values in order",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DataTableIndexReadMethod": {
        "enum": [
          "ExactMatch",
          "RangeLowerBound"
        ],
        "type": "string"
      },
      "DataTableIndexRequestV2": {
        "required": [
          "columnName"
        ],
        "type": "object",
        "properties": {
          "columnName": {
            "minLength": 1,
            "type": "string",
            "description": "Column name to index (required)",
            "example": "Age"
          },
          "indexReadMethod": {
            "$ref": "#/components/schemas/DataTableIndexReadMethod"
          }
        },
        "additionalProperties": false,
        "description": "Defines an index on a data table column for optimized lookups"
      },
      "DataTableIndexV1": {
        "required": [
          "columnName"
        ],
        "type": "object",
        "properties": {
          "columnName": {
            "type": "string",
            "nullable": true
          },
          "indexReadMethod": {
            "$ref": "#/components/schemas/DataTableIndexReadMethod"
          }
        },
        "additionalProperties": false
      },
      "DataTableIndexV2": {
        "required": [
          "columnName"
        ],
        "type": "object",
        "properties": {
          "columnName": {
            "type": "string",
            "nullable": true
          },
          "indexReadMethod": {
            "$ref": "#/components/schemas/DataTableIndexReadMethod"
          }
        },
        "additionalProperties": false
      },
      "FieldDataType": {
        "enum": [
          "Integer",
          "Decimal",
          "String",
          "Date",
          "Invalid",
          "Boolean",
          "DataTable",
          "DecrementTable",
          "Dynamic",
          "ScenarioTable",
          "YieldCurve",
          "List"
        ],
        "type": "string"
      },
      "FilePathAndVersionDtoV1": {
        "type": "object",
        "properties": {
          "filePath": {
            "type": "string",
            "description": "File Path",
            "nullable": true
          },
          "version": {
            "type": "integer",
            "description": "File Version",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FileReferenceDto": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "filePath": {
            "type": "string",
            "nullable": true
          },
          "fileVersion": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "delimiter": {
            "type": "string",
            "nullable": true
          },
          "excelSheetName": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GenerateScenarioTableRequestV1": {
        "required": [
          "filePath",
          "modelId",
          "name",
          "yearsToProject"
        ],
        "type": "object",
        "properties": {
          "modelId": {
            "type": "integer",
            "description": "Model ID.",
            "format": "int32"
          },
          "generatorType": {
            "enum": [
              "NAICGenerator"
            ],
            "type": "string",
            "description": "Economic scenario generator type. Valid values: NAICGenerator",
            "nullable": true
          },
          "name": {
            "minLength": 1,
            "type": "string",
            "description": "Name of the scenario table to be generated."
          },
          "filePath": {
            "minLength": 1,
            "type": "string",
            "description": "Slope file path where the generated scenario table will be stored."
          },
          "yearsToProject": {
            "type": "integer",
            "description": "Number of years to project.",
            "format": "int32"
          },
          "yieldCurveRateType": {
            "enum": [
              "BondEquivalent",
              "SpotRate"
            ],
            "type": "string",
            "description": "Yield curve rate type for generated scenario tables. Valid values: BondEquivalent, SpotRate",
            "nullable": true
          },
          "naicGeneratorParameters": {
            "$ref": "#/components/schemas/NaicGeneratorParametersRequestV1"
          }
        },
        "additionalProperties": false
      },
      "GenerateScenarioTableResponseV1": {
        "type": "object",
        "properties": {
          "generationId": {
            "type": "integer",
            "description": "The ID used to check the status of the scenario table generation",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "GenerateScenarioTableStatusResponseV1": {
        "type": "object",
        "properties": {
          "status": {
            "$ref": "#/components/schemas/GenerationStatus"
          },
          "scenarioTableId": {
            "type": "integer",
            "description": "Scenario Table ID (if the generation is complete)",
            "format": "int32",
            "nullable": true
          },
          "errorMessage": {
            "type": "string",
            "description": "Error Message (if the generation failed)",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GenerateWorkbookReportRequestV1": {
        "type": "object",
        "properties": {
          "elementId": {
            "type": "string",
            "description": "Workbook Element ID",
            "nullable": true
          },
          "reportFormat": {
            "$ref": "#/components/schemas/WorkbookReportFormatType"
          },
          "rowLimit": {
            "type": "integer",
            "description": "Row Limit",
            "format": "int32",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset",
            "format": "int32",
            "nullable": true
          },
          "parameters": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "nullable": true
            },
            "description": "Parameters — the Workbook control values to apply, keyed by the control's name. At least one\nprojection ID control has to be supplied; filtering the report down far enough to complete in\ntime is the caller's responsibility.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GenerateWorkbookReportResponseV1": {
        "type": "object",
        "properties": {
          "generationId": {
            "type": "string",
            "description": "Generation ID",
            "nullable": true
          },
          "reportStatusUrl": {
            "type": "string",
            "description": "The status URL to use with the generation ID.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GenerationStatus": {
        "enum": [
          "NotStarted",
          "Running",
          "Failed",
          "Completed"
        ],
        "type": "string"
      },
      "GetArrayDetailsResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "arraySource": {
            "$ref": "#/components/schemas/ArrayType"
          },
          "level": {
            "$ref": "#/components/schemas/CalculationType"
          },
          "values": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "productOutputGroupingId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "startValue": {
            "$ref": "#/components/schemas/RangeArrayValue"
          },
          "endValue": {
            "$ref": "#/components/schemas/RangeArrayValue"
          },
          "stepValue": {
            "$ref": "#/components/schemas/RangeArrayValue"
          },
          "variableName": {
            "type": "string",
            "nullable": true
          },
          "dimension1ArrayId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "dimension2ArrayId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetDataTableResponseColumnV1": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "order": {
            "type": "integer",
            "format": "int32"
          },
          "isIndex": {
            "type": "boolean"
          },
          "indexReadMethod": {
            "type": "string",
            "nullable": true
          },
          "dataType": {
            "type": "string",
            "nullable": true
          },
          "displayPrecision": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "dropDownListArrayId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "nestedTableStructureId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetDataTableResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "tableStructureId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "filePath": {
            "type": "string",
            "nullable": true
          },
          "fileVersion": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "columns": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetDataTableResponseColumnV1"
            },
            "nullable": true
          },
          "rows": {
            "type": "array",
            "items": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetDecrementTableResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Decrement Table ID",
            "format": "int32"
          },
          "modelId": {
            "type": "integer",
            "description": "Model ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Decrement Table Name",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "Decrement Table Description",
            "nullable": true
          },
          "decrementTableType": {
            "$ref": "#/components/schemas/MortalityTableType"
          },
          "improvementBaseYear": {
            "type": "integer",
            "description": "Improvement Base Year",
            "format": "int32",
            "nullable": true
          },
          "selectPeriodFrequency": {
            "$ref": "#/components/schemas/SelectPeriodFrequencyType"
          },
          "selectPeriod": {
            "type": "integer",
            "description": "Select Period",
            "format": "int32",
            "nullable": true
          },
          "version": {
            "type": "integer",
            "description": "Decrement Table Version",
            "format": "int32"
          },
          "isLatestVersion": {
            "type": "boolean",
            "description": "Is Latest Version?"
          }
        },
        "additionalProperties": false
      },
      "GetDownloadUrlResponseV1": {
        "type": "object",
        "properties": {
          "downloadUrl": {
            "type": "string",
            "description": "URL to use to download file content",
            "nullable": true
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "nullable": true
            },
            "description": "Metadata for the download file",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetFilesResponseItemV1": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "integer",
            "format": "int32"
          },
          "fileKey": {
            "type": "string",
            "nullable": true
          },
          "folder": {
            "type": "string",
            "nullable": true
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "sizeInBytes": {
            "type": "integer",
            "format": "int64"
          },
          "uploadedOnUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "version": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "GetImprovementScaleResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Improvement Scale ID",
            "format": "int32"
          },
          "modelId": {
            "type": "integer",
            "description": "Improvement Scale Model ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Improvement Scale Name",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "Improvement Scale Description",
            "nullable": true
          },
          "improvementScaleType": {
            "$ref": "#/components/schemas/ImprovementScaleType"
          },
          "firstCalendarYear": {
            "type": "integer",
            "description": "First Calendar Year",
            "format": "int32",
            "nullable": true
          },
          "ultimateCalendarYear": {
            "type": "integer",
            "description": "Ultimate Calendar Year",
            "format": "int32",
            "nullable": true
          },
          "version": {
            "type": "integer",
            "description": "Improvement Scale Version",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "GetModelArraysResponseItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Array ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Array Name",
            "nullable": true
          },
          "arraySource": {
            "type": "string",
            "description": "Array Source",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetModelDataTablesResponseItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Data Table ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Data Table Name",
            "nullable": true
          },
          "tableStructureId": {
            "type": "integer",
            "description": "Data Table Structure ID",
            "format": "int32",
            "nullable": true
          },
          "tableStructureName": {
            "type": "string",
            "description": "Data Table Structure Name",
            "nullable": true
          },
          "version": {
            "type": "integer",
            "description": "Data Table Version",
            "format": "int32"
          },
          "isLatestVersion": {
            "type": "boolean",
            "description": "Is Latest Version of Data Table?"
          }
        },
        "additionalProperties": false
      },
      "GetModelDecrementTablesResponseItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Decrement Table ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Decrement Table Name",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "Decrement Table Description",
            "nullable": true
          },
          "decrementTableType": {
            "$ref": "#/components/schemas/MortalityTableType"
          },
          "improvementBaseYear": {
            "type": "integer",
            "description": "Improvement Base Year",
            "format": "int32",
            "nullable": true
          },
          "selectPeriodFrequency": {
            "type": "string",
            "description": "Select Period Frequency",
            "nullable": true
          },
          "selectPeriod": {
            "type": "integer",
            "description": "Select Period",
            "format": "int32",
            "nullable": true
          },
          "version": {
            "type": "integer",
            "description": "Version",
            "format": "int32"
          },
          "isLatestVersion": {
            "type": "boolean",
            "description": "Is Latest Version of Decrement Table?"
          }
        },
        "additionalProperties": false
      },
      "GetModelImprovementScalesResponseItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Improvement Scale ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Improvement Scale Name",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "Improvement Scale Description",
            "nullable": true
          },
          "improvementScaleType": {
            "$ref": "#/components/schemas/ImprovementScaleType"
          },
          "firstCalendarYear": {
            "type": "integer",
            "description": "First Calendar Year",
            "format": "int32",
            "nullable": true
          },
          "ultimateCalendarYear": {
            "type": "integer",
            "description": "Ultimate Calendar Year",
            "format": "int32",
            "nullable": true
          },
          "version": {
            "type": "integer",
            "description": "Version",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "GetModelInvestmentStrategiesResponseItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Investment Strategy ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Investment Strategy Name",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "Investment Strategy Description",
            "nullable": true
          },
          "version": {
            "type": "integer",
            "description": "Version",
            "format": "int32"
          },
          "isLatestVersion": {
            "type": "boolean",
            "description": "Is Latest Version of Investment Strategy?"
          }
        },
        "additionalProperties": false
      },
      "GetModelPointFieldsResponseItemV1": {
        "type": "object",
        "properties": {
          "fieldId": {
            "type": "integer",
            "format": "int32"
          },
          "fieldName": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "dataType": {
            "$ref": "#/components/schemas/FieldDataType"
          },
          "isRequired": {
            "type": "boolean"
          },
          "scalesOnPurchaseOrSale": {
            "type": "boolean"
          },
          "defaultValueSource": {
            "$ref": "#/components/schemas/ModelPointFieldDefaultMethodType"
          },
          "defaultValue": {
            "type": "string",
            "nullable": true
          },
          "aliases": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "isSystemField": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "GetModelProductOutputGroupingsResponseItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Product Output Grouping ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Product Output Grouping name, or null when the grouping is unnamed.",
            "nullable": true
          },
          "variableNames": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Names of the variables contained in the Product Output Grouping",
            "nullable": true
          },
          "variableScope": {
            "$ref": "#/components/schemas/GetModelProductOutputGroupingsVariableScopeV1"
          }
        },
        "additionalProperties": false
      },
      "GetModelProductOutputGroupingsVariableScopeV1": {
        "type": "object",
        "properties": {
          "applyToAllVariables": {
            "type": "boolean",
            "description": "True when the Product Output Grouping applies to every aggregate variable."
          },
          "variables": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Names of the variables the Product Output Grouping is scoped to, in the order they were selected. Empty when none are selected.",
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Names of the variable tags the Product Output Grouping is scoped to. Empty when none are selected.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetModelProductsResponseItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Product ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Product Name",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "Product Description",
            "nullable": true
          },
          "type": {
            "$ref": "#/components/schemas/ProductType"
          }
        },
        "additionalProperties": false
      },
      "GetModelProjectionTemplatesResponseItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetModelScenarioTablesFileReferenceV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "File Reference ID",
            "format": "int32"
          },
          "version": {
            "type": "integer",
            "description": "File Reference Version",
            "format": "int32"
          },
          "path": {
            "type": "string",
            "description": "File Reference Path",
            "nullable": true
          },
          "delimiter": {
            "type": "string",
            "description": "Delimiter",
            "nullable": true
          },
          "excelSheetName": {
            "type": "string",
            "description": "Excel Sheet Name",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetModelScenarioTablesResponseItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Scenario Table ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Scenario Table Name",
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "description": "Start Date",
            "format": "date-time"
          },
          "yieldCurveRateType": {
            "$ref": "#/components/schemas/YieldCurveRateType"
          },
          "shortTermInterpolationMethod": {
            "$ref": "#/components/schemas/ShortTermInterpolationMethod"
          },
          "version": {
            "type": "integer",
            "description": "Scenario Table Version",
            "format": "int32"
          },
          "fileReference": {
            "$ref": "#/components/schemas/GetModelScenarioTablesFileReferenceV1"
          }
        },
        "additionalProperties": false
      },
      "GetModelTableStructuresResponseItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Table Structure ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Table Structure Name",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "Table Structure Description",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetModelVariableRatesResponseItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Variable Rate ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Variable Rate Name",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "Variable Rate Description",
            "nullable": true
          },
          "rateInputType": {
            "$ref": "#/components/schemas/VariableRateType"
          }
        },
        "additionalProperties": false
      },
      "GetProjectionDataTableV1": {
        "type": "object",
        "properties": {
          "tableStructureId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "tableStructureName": {
            "type": "string",
            "nullable": true
          },
          "dataTableId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "dataTableName": {
            "type": "string",
            "nullable": true
          },
          "dataTableVersionNumber": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "isRequired": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "GetProjectionModelV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetProjectionPortfolioProductV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "productId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "productType": {
            "$ref": "#/components/schemas/ProductType"
          },
          "modelPointFile": {
            "$ref": "#/components/schemas/FileReferenceDto"
          },
          "filters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetProjectionProductModelPointFilterV1"
            },
            "nullable": true
          },
          "productOutputGroupings": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetProjectionPortfolioProductsResponseItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Product ID on the projection",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Product Name",
            "nullable": true
          },
          "productId": {
            "type": "integer",
            "description": "Product ID on the model. Null when the product it was created from has been deleted.",
            "format": "int32",
            "nullable": true
          },
          "type": {
            "$ref": "#/components/schemas/ProductType"
          },
          "modelPointFileId": {
            "type": "integer",
            "description": "Model point file ID. Null when no model point file has been uploaded.",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetProjectionPortfolioV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "productOutputGroupings": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "The groupings selected on the portfolio itself. Products listed below carry their own effective set;\nproducts that only reach the portfolio through an investment strategy or a new business allocation are\ngrouped by this selection alone.",
            "nullable": true
          },
          "products": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetProjectionPortfolioProductV1"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetProjectionPortfoliosResponseItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Portfolio ID on the projection",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Portfolio Name",
            "nullable": true
          },
          "portfolioId": {
            "type": "integer",
            "description": "Portfolio ID on the model. Null when the portfolio it was created from has been deleted.",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetProjectionProductModelPointFilterV1": {
        "type": "object",
        "properties": {
          "field": {
            "type": "string",
            "nullable": true
          },
          "value": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetProjectionResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/ProjectionRunStatus"
          },
          "isRunning": {
            "type": "boolean"
          },
          "startDate": {
            "type": "string",
            "format": "date-time"
          },
          "periodInMonths": {
            "type": "integer",
            "format": "int32"
          },
          "runStartDateUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "runCompletedDateUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "outputAllResults": {
            "type": "boolean"
          },
          "disableModelPointOutput": {
            "type": "boolean"
          },
          "forceStaticProcessing": {
            "type": "boolean"
          },
          "isLocked": {
            "type": "boolean"
          },
          "archivalStatus": {
            "$ref": "#/components/schemas/ProjectionArchivalStatusV1"
          },
          "numberOfCores": {
            "type": "integer",
            "format": "int32"
          },
          "scenarioTableId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "model": {
            "$ref": "#/components/schemas/GetProjectionModelV1"
          },
          "portfolios": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetProjectionPortfolioV1"
            },
            "nullable": true
          },
          "virtualFolders": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "dataTables": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetProjectionDataTableV1"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetScenarioTableResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Scenario Table ID",
            "format": "int32"
          },
          "modelId": {
            "type": "integer",
            "description": "Model ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Scenario Table Name",
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "description": "State Date",
            "format": "date-time"
          },
          "yieldCurveRateType": {
            "$ref": "#/components/schemas/YieldCurveRateType"
          },
          "shortTermInterpolationMethod": {
            "$ref": "#/components/schemas/ShortTermInterpolationMethod"
          },
          "version": {
            "type": "integer",
            "description": "Version",
            "format": "int32"
          },
          "fileId": {
            "type": "integer",
            "description": "Scenario Table File ID",
            "format": "int32",
            "nullable": true
          },
          "filePath": {
            "type": "string",
            "description": "Scenario Table File Path",
            "nullable": true
          },
          "fileVersion": {
            "type": "integer",
            "description": "Scenario Table File Version",
            "format": "int32",
            "nullable": true
          },
          "delimiter": {
            "type": "string",
            "description": "Scenario Table File Delimiter",
            "nullable": true
          },
          "excelSheetName": {
            "type": "string",
            "description": "Scenario Table File Excel Shet Name",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetTableStructureColumnsResponseItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Column ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Column Name",
            "nullable": true
          },
          "dataType": {
            "$ref": "#/components/schemas/TableStructureColumnType"
          },
          "tableStructureId": {
            "type": "integer",
            "description": "Nested Table Structure ID (when DataType is DataTable)",
            "format": "int32",
            "nullable": true
          },
          "dropDownListArrayId": {
            "type": "integer",
            "description": "Array ID (when DataType is DropDownList)",
            "format": "int32",
            "nullable": true
          },
          "isIndex": {
            "type": "boolean",
            "description": "Is Index?"
          },
          "sortOrder": {
            "type": "integer",
            "description": "Sort Order",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "GetTableStructureDataTablesResponseItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Data Table ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Data Table Name",
            "nullable": true
          },
          "version": {
            "type": "integer",
            "description": "Data Table Version",
            "format": "int32"
          },
          "isLatestVersion": {
            "type": "boolean",
            "description": "Is Latest Version?"
          },
          "tableStructureId": {
            "type": "integer",
            "description": "Table Structure ID",
            "format": "int32",
            "nullable": true
          },
          "tableStructureName": {
            "type": "string",
            "description": "Table Structure Name",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetTableStructureResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Table Structure ID",
            "format": "int32"
          },
          "modelId": {
            "type": "integer",
            "description": "Model ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Table Structure Name",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "Table Structure Description",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetUploadUrlFilePathDtoV1": {
        "type": "object",
        "properties": {
          "filePath": {
            "type": "string",
            "description": "File Path",
            "nullable": true
          },
          "contentType": {
            "type": "string",
            "description": "Optional File Content Type",
            "nullable": true
          },
          "contentMD5": {
            "type": "string",
            "description": "Optional MD5 Hash for File Content",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetUploadUrlResponseV1": {
        "type": "object",
        "properties": {
          "uploadUrl": {
            "type": "string",
            "description": "URL to use to upload file content",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetUsersResponseItemV1": {
        "type": "object",
        "properties": {
          "userEmail": {
            "type": "string",
            "description": "User's Email",
            "nullable": true
          },
          "userName": {
            "type": "string",
            "description": "User's Name",
            "nullable": true
          },
          "roles": {
            "type": "string",
            "description": "User's Roles",
            "nullable": true
          },
          "status": {
            "type": "string",
            "description": "User's Status",
            "nullable": true
          },
          "lastVisitDate": {
            "type": "string",
            "description": "User's Last Visit Date",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetWorkbookReportGenerationStatusResponseV1": {
        "type": "object",
        "properties": {
          "status": {
            "$ref": "#/components/schemas/ReportGenerationStatus"
          },
          "downloadUrl": {
            "type": "string",
            "description": "Download URL",
            "nullable": true
          },
          "message": {
            "type": "string",
            "description": "Message",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ImportDataTableRequestV2": {
        "required": [
          "name",
          "tableStructureId"
        ],
        "type": "object",
        "properties": {
          "fileId": {
            "type": "integer",
            "description": "File ID",
            "format": "int32",
            "nullable": true
          },
          "filePath": {
            "type": "string",
            "description": "File Path",
            "nullable": true
          },
          "fileVersion": {
            "type": "integer",
            "description": "File Version",
            "format": "int32",
            "nullable": true
          },
          "delimiter": {
            "type": "string",
            "description": "Delimiter",
            "nullable": true
          },
          "excelSheetName": {
            "type": "string",
            "description": "Excel Sheet Name",
            "nullable": true
          },
          "tableStructureId": {
            "type": "integer",
            "description": "Table Structure ID (required)",
            "format": "int32",
            "example": 1
          },
          "name": {
            "maxLength": 128,
            "minLength": 0,
            "type": "string",
            "description": "Name (required)"
          },
          "isFileOnly": {
            "type": "boolean",
            "description": "Is File Only?"
          },
          "indexes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DataTableIndexV2"
            },
            "description": "Optional list of indexes",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ImportDataTableResponseV2": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "tableStructureId": {
            "type": "integer",
            "format": "int32"
          },
          "tableStructureName": {
            "type": "string",
            "nullable": true
          },
          "isFileOnly": {
            "type": "boolean"
          },
          "version": {
            "type": "integer",
            "format": "int32"
          },
          "isLatestVersion": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ImprovementScaleType": {
        "enum": [
          "Standard",
          "Generational"
        ],
        "type": "string"
      },
      "ListModelsResponseItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Model ID",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Model Name",
            "nullable": true
          },
          "lastModifiedOn": {
            "type": "string",
            "description": "Last Modified Date",
            "format": "date-time"
          },
          "folderPath": {
            "type": "string",
            "description": "Folder path (if model is in a folder)",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ListProjectionsResponseItemV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/ProjectionRunStatus"
          },
          "startDate": {
            "type": "string",
            "format": "date-time"
          },
          "isRunning": {
            "type": "boolean"
          },
          "isLocked": {
            "type": "boolean"
          },
          "virtualFolders": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "runStartDateUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "runCompletedDateUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "modelId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ModelCopyStatusResponseV1": {
        "type": "object",
        "properties": {
          "status": {
            "$ref": "#/components/schemas/ModelCopyStatusV1"
          },
          "newModelId": {
            "type": "integer",
            "description": "ID of the newly created model (only populated when Status is Completed)",
            "format": "int32",
            "nullable": true
          },
          "errorMessage": {
            "type": "string",
            "description": "Error message if the copy operation failed (only populated when Status is Failed)",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ModelCopyStatusV1": {
        "enum": [
          "Running",
          "Completed",
          "Failed"
        ],
        "type": "string",
        "description": "Status of a model copy operation"
      },
      "ModelPointFieldDefaultMethodType": {
        "enum": [
          "None",
          "DefinedValue"
        ],
        "type": "string"
      },
      "ModelTypeFilter": {
        "enum": [
          "Library",
          "Workspace",
          "Production"
        ],
        "type": "string"
      },
      "MortalityTableType": {
        "enum": [
          "Standard",
          "Improving",
          "SelectAndUltimate"
        ],
        "type": "string"
      },
      "NaicGeneratorParametersRequestV1": {
        "required": [
          "datasetDate"
        ],
        "type": "object",
        "properties": {
          "datasetDate": {
            "minLength": 1,
            "type": "string",
            "description": "Dataset date for the NAIC generator. Expected format: YYYY-MM-DD"
          },
          "scenarioSet": {
            "enum": [
              "Full10000Scenarios",
              "SubsetScenarios",
              "StochasticExclusionTestScenarios"
            ],
            "type": "string",
            "description": "The NAIC generator scenario set type. Valid values: Full10000Scenarios, SubsetScenarios, StochasticExclusionTestScenarios",
            "nullable": true
          },
          "numberOfScenarios": {
            "type": "integer",
            "description": "Number of scenarios to generate. Used by the NAIC generator.",
            "format": "int32",
            "nullable": true
          },
          "scenarioSubsetMethod": {
            "enum": [
              "SignificanceValue",
              "LargeCapGrowthWealthFactor",
              "FirstN"
            ],
            "type": "string",
            "description": "The NAIC generator scenario subset method. Valid values: SignificanceValue, LargeCapGrowthWealthFactor, FirstN",
            "nullable": true
          },
          "scenarioNumbering": {
            "enum": [
              "RenumberInAscendingOrder",
              "KeepOriginalScenarioNumbers"
            ],
            "type": "string",
            "description": "The NAIC generator scenario numbering method. Valid values: RenumberInAscendingOrder, KeepOriginalScenarioNumbers",
            "nullable": true
          },
          "variableRateMappings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NaicVariableRateMappingRequestV1"
            },
            "description": "List of variable rate mappings for the NAIC scenario generator.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "NaicVariableRateMappingRequestV1": {
        "required": [
          "returnComponentName",
          "returnTypeName",
          "variableRateId"
        ],
        "type": "object",
        "properties": {
          "variableRateId": {
            "type": "integer",
            "description": "Variable rate ID.",
            "format": "int32"
          },
          "returnTypeName": {
            "minLength": 1,
            "type": "string",
            "description": "Return type name."
          },
          "returnComponentName": {
            "minLength": 1,
            "type": "string",
            "description": "Return component name."
          }
        },
        "additionalProperties": false
      },
      "OverwriteDataTableRequestV2": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "integer",
            "description": "File ID",
            "format": "int32",
            "nullable": true
          },
          "filePath": {
            "type": "string",
            "description": "File Path",
            "nullable": true
          },
          "fileVersion": {
            "type": "integer",
            "description": "File Version",
            "format": "int32",
            "nullable": true
          },
          "delimiter": {
            "type": "string",
            "description": "Delimiter",
            "nullable": true
          },
          "excelSheetName": {
            "type": "string",
            "description": "Excel Sheet Name",
            "nullable": true
          },
          "isFileOnly": {
            "type": "boolean",
            "description": "Is File Only?"
          },
          "indexes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DataTableIndexV2"
            },
            "description": "Optional list of indexes to update index read methods.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request model for overwriting an existing data table from a file."
      },
      "PaginatedResponseGetFilesResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetFilesResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseGetModelArraysResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetModelArraysResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseGetModelDataTablesResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetModelDataTablesResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseGetModelDecrementTablesResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetModelDecrementTablesResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseGetModelImprovementScalesResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetModelImprovementScalesResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseGetModelInvestmentStrategiesResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetModelInvestmentStrategiesResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseGetModelPointFieldsResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetModelPointFieldsResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseGetModelProductOutputGroupingsResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetModelProductOutputGroupingsResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseGetModelProductsResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetModelProductsResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseGetModelProjectionTemplatesResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetModelProjectionTemplatesResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseGetModelScenarioTablesResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetModelScenarioTablesResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseGetModelTableStructuresResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetModelTableStructuresResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseGetModelVariableRatesResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetModelVariableRatesResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseGetProjectionPortfolioProductsResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetProjectionPortfolioProductsResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseGetProjectionPortfoliosResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetProjectionPortfoliosResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseGetTableStructureColumnsResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetTableStructureColumnsResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseGetTableStructureDataTablesResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GetTableStructureDataTablesResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseListModelsResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ListModelsResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "PaginatedResponseListProjectionsResponseItemV1": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ListProjectionsResponseItemV1"
            },
            "description": "Items within the page",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "description": "Offset to retrieve the next page. Null when there are no further records.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Paginated response that will only return an offset if there are remaining pages"
      },
      "ProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "instance": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": { }
      },
      "ProductType": {
        "enum": [
          "Asset",
          "Liability"
        ],
        "type": "string"
      },
      "ProjectionArchivalStatusV1": {
        "enum": [
          "Unarchived",
          "Archived",
          "Unarchiving"
        ],
        "type": "string",
        "description": "A projection's archival status as the public API reports it."
      },
      "ProjectionRunStatus": {
        "enum": [
          "NotStarted",
          "Running",
          "Completed",
          "Failed",
          "Queued",
          "Cancelled",
          "CompletedWithErrors",
          "ErrorLimitReached",
          "WaitingForInserts",
          "Queuing",
          "Deleting",
          "Preparing",
          "FailedToStart",
          "Validating",
          "ValidationFailed",
          "CompletedWithWarnings"
        ],
        "type": "string"
      },
      "RangeArrayValue": {
        "type": "object",
        "properties": {
          "type": {
            "$ref": "#/components/schemas/RangeArrayVariableType"
          },
          "variableName": {
            "type": "string",
            "nullable": true
          },
          "value": {
            "type": "number",
            "format": "double",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RangeArrayVariableType": {
        "enum": [
          "Variable",
          "Constant",
          "TimeIndex"
        ],
        "type": "string"
      },
      "RefreshParametersV1": {
        "type": "object",
        "properties": {
          "refreshToken": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false
      },
      "ReportGenerationStatus": {
        "enum": [
          "Running",
          "Completed",
          "Failed"
        ],
        "type": "string"
      },
      "SaveUploadFilePathDtoV1": {
        "type": "object",
        "properties": {
          "filePath": {
            "type": "string",
            "description": "File Path",
            "nullable": true
          },
          "contentMD5": {
            "type": "string",
            "description": "Optional MD5 Hash for File Content",
            "nullable": true
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "nullable": true
            },
            "description": "Metadata to include with the file when saved",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SaveUploadResponseV1": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "integer",
            "description": "File ID of the saved file at the provided path",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "SelectPeriodFrequencyType": {
        "enum": [
          "Annual",
          "Monthly"
        ],
        "type": "string"
      },
      "ShortTermInterpolationMethod": {
        "enum": [
          "AnnualEffectiveRate",
          "FromZero"
        ],
        "type": "string"
      },
      "TableStructureColumnType": {
        "enum": [
          "Integer",
          "Decimal",
          "String",
          "Date",
          "Boolean",
          "MortalityTable",
          "DataTable",
          "DropDownList",
          "ScenarioTable"
        ],
        "type": "string"
      },
      "UnarchiveProjectionResponseV1": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateDataTableDataRequestV1": {
        "required": [
          "rows"
        ],
        "type": "object",
        "properties": {
          "rows": {
            "type": "array",
            "items": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Row data to replace existing table data.\nEach row is an array of string values matching the column order from GET /Data endpoint.\nIndex columns first (sorted by SortOrder), then data columns (sorted by SortOrder)."
          },
          "indexes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DataTableIndexV1"
            },
            "description": "Optional - Update index read methods while updating data.\nIf not provided, existing index read methods are preserved.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request model for updating data table row data without a file upload."
      },
      "UpdateDataTableDataResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "The data table ID (may differ from request if table was versioned).",
            "format": "int32"
          },
          "version": {
            "type": "integer",
            "description": "The current version number of the data table.",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Response model for successful data table data update."
      },
      "UpdateDataTableRequestV1": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "integer",
            "description": "File ID",
            "format": "int32",
            "nullable": true
          },
          "filePath": {
            "type": "string",
            "description": "File Path",
            "nullable": true
          },
          "fileVersion": {
            "type": "integer",
            "description": "File Version",
            "format": "int32",
            "nullable": true
          },
          "delimiter": {
            "type": "string",
            "description": "Delimiter",
            "nullable": true
          },
          "excelSheetName": {
            "type": "string",
            "description": "Excel Sheet Name",
            "nullable": true
          },
          "dataTableId": {
            "type": "integer",
            "description": "Date Table ID",
            "format": "int32",
            "nullable": true
          },
          "tableStructureId": {
            "type": "integer",
            "description": "Table Structure ID",
            "format": "int32",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Date Table Name",
            "nullable": true
          },
          "isFileOnly": {
            "type": "boolean",
            "description": "Is File Only?"
          },
          "indexes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DataTableIndexV1"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateDataTableRequestV2": {
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 128,
            "minLength": 0,
            "type": "string",
            "description": "Updated name for the data table (optional).\nIf not provided, the existing name will be retained.",
            "nullable": true,
            "example": "Updated Pension Conversion Table"
          },
          "indexes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DataTableIndexV2"
            },
            "description": "Updated list of indexes for the data table (optional).\nIf not provided, existing indexes will be retained.\nPass an empty array to remove all indexes.",
            "nullable": true,
            "example": [
              {
                "columnName": "Age",
                "indexReadMethod": "ExactMatch"
              },
              {
                "columnName": "Duration",
                "indexReadMethod": "RangeLowerBound"
              }
            ]
          }
        },
        "additionalProperties": false,
        "description": "Request model for updating individual properties of a data table.\nOnly properties that are provided will be updated."
      },
      "UpdateDataTableResponseV2": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "The ID of the updated data table.",
            "format": "int32",
            "example": 12345
          },
          "version": {
            "type": "integer",
            "description": "The version number of the data table after the update.\nThis may be incremented if the table was versioned due to being used in projections.",
            "format": "int32",
            "example": 2
          }
        },
        "additionalProperties": false,
        "description": "Response model for data table update operations."
      },
      "UpdateModelPointFieldRequestV1": {
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 64,
            "minLength": 0,
            "type": "string",
            "description": "The updated name of the model point field. Must be unique within the product.",
            "nullable": true
          },
          "description": {
            "maxLength": 2000,
            "minLength": 0,
            "type": "string",
            "description": "The updated description of the model point field. Omit to leave unchanged; set to an empty string to clear it.",
            "nullable": true
          },
          "dataType": {
            "$ref": "#/components/schemas/FieldDataType"
          },
          "isRequired": {
            "type": "boolean",
            "description": "Whether the field is required in model point files. Cannot be changed for system fields.",
            "nullable": true
          },
          "isScaledOnPurchaseOrSale": {
            "type": "boolean",
            "description": "Whether the field scales on purchase or sale. Only applicable to Decimal fields. Cannot be changed for system fields.",
            "nullable": true
          },
          "defaultValueSource": {
            "$ref": "#/components/schemas/ModelPointFieldDefaultMethodType"
          },
          "defaultValue": {
            "type": "string",
            "description": "The default value when DefaultMethodType is DefinedValue.",
            "nullable": true
          },
          "aliases": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Alternative names for this field. Must be unique within the product.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request model for updating an existing model point field.\nAll fields are optional to support partial updates."
      },
      "UpdateModelPointFieldResponseV1": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "The ID of the updated model point field.",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "The name of the updated model point field.",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "The description of the updated model point field.",
            "nullable": true
          },
          "dataType": {
            "$ref": "#/components/schemas/FieldDataType"
          },
          "isRequired": {
            "type": "boolean",
            "description": "Whether the field is required in model point files."
          },
          "isScaledOnPurchaseOrSale": {
            "type": "boolean",
            "description": "Whether the field scales on purchase or sale."
          },
          "defaultValueSource": {
            "$ref": "#/components/schemas/ModelPointFieldDefaultMethodType"
          },
          "defaultValue": {
            "type": "string",
            "description": "The default value if using defined value method.",
            "nullable": true
          },
          "aliases": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Alternative names for this field.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Response model for model point field update."
      },
      "UpdateProjectionDataTableDto": {
        "type": "object",
        "properties": {
          "tableStructureId": {
            "type": "integer",
            "description": "Table Structure ID",
            "format": "int32",
            "nullable": true
          },
          "tableStructureName": {
            "type": "string",
            "description": "Table Structure Name",
            "nullable": true
          },
          "dataTableId": {
            "type": "integer",
            "description": "Data Table ID",
            "format": "int32",
            "nullable": true
          },
          "dataTableName": {
            "type": "string",
            "description": "Data Table Name",
            "nullable": true
          },
          "dataTableVersion": {
            "type": "integer",
            "description": "Data Table Version",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateProjectionPortfolioDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Portfolio ID",
            "format": "int32",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Portfolio Name",
            "nullable": true
          },
          "products": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UpdateProjectionProductDto"
            },
            "description": "Portfolio Products",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateProjectionProductDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Product ID",
            "format": "int32",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Product Name",
            "nullable": true
          },
          "modelPointFile": {
            "$ref": "#/components/schemas/FileReferenceDto"
          },
          "modelPointFilters": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "nullable": true
            },
            "description": "Model Point Filters",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateProjectionRequestV1": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Projection Name - Can be updated for projections in any status",
            "nullable": true
          },
          "scenarioTableId": {
            "type": "integer",
            "description": "Scenario Table ID",
            "format": "int32",
            "nullable": true
          },
          "scenarioSubset": {
            "type": "string",
            "description": "Scenario Subset",
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "description": "Start Date",
            "format": "date-time",
            "nullable": true
          },
          "periodInMonths": {
            "type": "integer",
            "description": "Period in Months",
            "format": "int32",
            "nullable": true
          },
          "outputAllResults": {
            "type": "boolean",
            "description": "Output All Results",
            "nullable": true
          },
          "disableModelPointOutput": {
            "type": "boolean",
            "description": "Disable Model Point Output",
            "nullable": true
          },
          "forceStaticProcessing": {
            "type": "boolean",
            "description": "Force Static Processing",
            "nullable": true
          },
          "numberOfCores": {
            "type": "integer",
            "description": "Number of Cores",
            "format": "int32",
            "nullable": true
          },
          "validateModelPointFiles": {
            "type": "boolean",
            "description": "Validate Model Point Files",
            "nullable": true
          },
          "dataTables": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UpdateProjectionDataTableDto"
            },
            "description": "Projection Data Tables",
            "nullable": true
          },
          "portfolios": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UpdateProjectionPortfolioDto"
            },
            "description": "Projection Portfolios",
            "nullable": true
          },
          "virtualFolders": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Virtual Folders - Array of folder paths. Projections can exist in multiple folders. If empty array is passed, all folders are cleared. If not passed, folders are not updated. Can be updated for projections in any status.",
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Tags - Array of tag names. If empty array is passed, all tags are cleared. If not passed, tags are not updated. Can be updated for projections in any status.",
            "nullable": true
          },
          "isLocked": {
            "type": "boolean",
            "description": "Lock or unlock a projection. Locking requires LockProjections permission or a workspace token. Unlocking requires UnlockProjections permission or a workspace token. Only projections in a completed/failed status can be locked.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateScenarioTableRequestV1": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "integer",
            "description": "File ID",
            "format": "int32",
            "nullable": true
          },
          "filePath": {
            "type": "string",
            "description": "File Path",
            "nullable": true
          },
          "fileVersion": {
            "type": "integer",
            "description": "File Version",
            "format": "int32",
            "nullable": true
          },
          "delimiter": {
            "type": "string",
            "description": "Delimiter",
            "nullable": true
          },
          "excelSheetName": {
            "type": "string",
            "description": "Excel Sheet Name",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Scenario Table Name",
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "description": "Scenario Table Start Date",
            "nullable": true
          },
          "yieldCurveRateType": {
            "$ref": "#/components/schemas/YieldCurveRateType"
          },
          "shortTermInterpolationMethod": {
            "$ref": "#/components/schemas/ShortTermInterpolationMethod"
          },
          "validateFile": {
            "type": "boolean",
            "description": "Validate the uploaded file. Defaults to true. Set to false to skip validation on upload and avoid request\ntimeouts for large files; the file will instead be validated when a projection is run.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateStaticArrayValuesRequestV1": {
        "required": [
          "values"
        ],
        "type": "object",
        "properties": {
          "values": {
            "minItems": 1,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ArrayValueItemV1"
            },
            "description": "The list of values to set for the static array.\nThis will completely replace all existing values."
          }
        },
        "additionalProperties": false
      },
      "UpdateStaticArrayValuesResponseV1": {
        "type": "object",
        "properties": {
          "arrayId": {
            "type": "integer",
            "description": "The ID of the updated array",
            "format": "int32"
          },
          "values": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The updated list of array values in order",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "VariableRateType": {
        "enum": [
          "MonthlyReturns",
          "AnnualReturns",
          "IndexValues"
        ],
        "type": "string"
      },
      "WorkbookReportFormatType": {
        "enum": [
          "Csv",
          "Excel",
          "Png"
        ],
        "type": "string"
      },
      "YieldCurveRateType": {
        "enum": [
          "BondEquivalent",
          "AnnualEffective",
          "SpotRate"
        ],
        "type": "string"
      }
    },
    "securitySchemes": {
      "API Token": {
        "type": "http",
        "description": "The API token received from the Authorize endpoint goes here.",
        "scheme": "Bearer",
        "bearerFormat": "JWT"
      }
    }
  }
}