{
  "openapi": "3.0.0",
  "info": {
    "title": "Frameleaf Server API",
    "version": "3.2.0",
    "description": "Selected self-hosted library and administration endpoints for API-key integrations. Cloud services, account linking, internal worker protocols and mixed Cloud configuration contracts are excluded. This is a public subset, not the complete application API."
  },
  "servers": [
    {
      "url": "/api",
      "description": "Your Frameleaf server"
    }
  ],
  "paths": {
    "/activities": {
      "get": {
        "description": "Returns a list of activities for the selected asset or album. The activities are returned in sorted order, with the oldest activities appearing first.",
        "operationId": "getActivities",
        "parameters": [
          {
            "name": "albumId",
            "required": true,
            "in": "query",
            "description": "Album ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "assetId",
            "required": false,
            "in": "query",
            "description": "Asset ID (if activity is for an asset)",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "level",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/ReactionLevel"
            }
          },
          {
            "name": "type",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/ReactionType"
            }
          },
          {
            "name": "userId",
            "required": false,
            "in": "query",
            "description": "Filter by user ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/ActivityResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List all activities",
        "tags": [
          "Activities"
        ],
        "x-frameleaf-permission": "activity.read"
      },
      "post": {
        "description": "Create a like or a comment for an album, or an asset in an album.",
        "operationId": "createActivity",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ActivityCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ActivityResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create an activity",
        "tags": [
          "Activities"
        ],
        "x-frameleaf-permission": "activity.create"
      }
    },
    "/activities/statistics": {
      "get": {
        "description": "Returns the number of likes and comments for a given album or asset in an album.",
        "operationId": "getActivityStatistics",
        "parameters": [
          {
            "name": "albumId",
            "required": true,
            "in": "query",
            "description": "Album ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "assetId",
            "required": false,
            "in": "query",
            "description": "Asset ID (if activity is for an asset)",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ActivityStatisticsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve activity statistics",
        "tags": [
          "Activities"
        ],
        "x-frameleaf-permission": "activity.statistics"
      }
    },
    "/activities/{id}": {
      "delete": {
        "description": "Removes a like or comment from a given album or asset in an album.",
        "operationId": "deleteActivity",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete an activity",
        "tags": [
          "Activities"
        ],
        "x-frameleaf-permission": "activity.delete"
      }
    },
    "/admin/backup-devices": {
      "get": {
        "description": "Administrative metadata only. No reconciliation digests or foreign asset access. quietForDays is elapsed whole days since reported successful backup, null when never reported.",
        "operationId": "listAllBackupDevices",
        "parameters": [
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 200,
              "default": 100,
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 0,
              "maximum": 1000000,
              "default": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BackupDeviceListDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List backup device metadata across users",
        "tags": [
          "Users (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "adminUser.read"
      }
    },
    "/admin/database-backups": {
      "delete": {
        "description": "Delete a backup by its filename",
        "operationId": "deleteDatabaseBackup",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DatabaseBackupDeleteDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete database backup",
        "tags": [
          "Database Backups (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "backup.delete"
      },
      "get": {
        "description": "Get the list of the successful and failed backups",
        "operationId": "listDatabaseBackups",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DatabaseBackupListResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List database backups",
        "tags": [
          "Database Backups (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "maintenance"
      }
    },
    "/admin/database-backups/restore-verification": {
      "get": {
        "description": "When restoring the database and the original files was last proved, and whether a test is due",
        "operationId": "getBackupRestoreVerification",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BackupRestoreVerificationResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get backup restore verification",
        "tags": [
          "Database Backups (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "maintenance"
      },
      "post": {
        "description": "Records that restoring the database, the original files or both was proved just now",
        "operationId": "recordBackupRestoreVerification",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BackupRestoreVerificationRecordDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BackupRestoreVerificationResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Record a backup restore test",
        "tags": [
          "Database Backups (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "maintenance"
      }
    },
    "/admin/database-backups/start-restore": {
      "post": {
        "description": "Put Frameleaf into maintenance mode to restore a backup (Frameleaf must not be configured)",
        "operationId": "startDatabaseRestoreFlow",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Start database backup restore flow",
        "tags": [
          "Database Backups (admin)"
        ],
        "security": []
      }
    },
    "/admin/database-backups/upload": {
      "post": {
        "description": "Uploads .sql/.sql.gz file to restore backup from",
        "operationId": "uploadDatabaseBackup",
        "parameters": [],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DatabaseBackupUploadDto"
              }
            }
          },
          "description": "Backup Upload",
          "required": true
        },
        "responses": {
          "201": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Upload database backup",
        "tags": [
          "Database Backups (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "backup.upload"
      }
    },
    "/admin/database-backups/{filename}": {
      "get": {
        "description": "Downloads the database backup file",
        "operationId": "downloadDatabaseBackup",
        "parameters": [
          {
            "name": "filename",
            "required": true,
            "in": "path",
            "schema": {
              "pattern": "^[a-zA-Z0-9_\\-.]+$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Download database backup",
        "tags": [
          "Database Backups (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "backup.download"
      }
    },
    "/admin/file-trash": {
      "get": {
        "description": "Originals no library references any more, newest first, with the total disk space the file trash holds. Nothing here is deleted automatically.",
        "operationId": "getFileTrash",
        "parameters": [
          {
            "name": "page",
            "required": false,
            "in": "query",
            "description": "Page number, from 1",
            "schema": {
              "minimum": 1,
              "maximum": 9007199254740991,
              "default": 1,
              "type": "integer"
            }
          },
          {
            "name": "size",
            "required": false,
            "in": "query",
            "description": "Entries per page",
            "schema": {
              "minimum": 1,
              "maximum": 500,
              "default": 100,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FileTrashResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List the file trash",
        "tags": [
          "File trash (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "maintenance"
      }
    },
    "/admin/file-trash/{id}": {
      "delete": {
        "description": "Delete the file from disk for good. This cannot be undone.",
        "operationId": "deleteFileTrashItem",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a file permanently",
        "tags": [
          "File trash (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "maintenance"
      }
    },
    "/admin/file-trash/{id}/restore": {
      "post": {
        "description": "Re-import the file as a new asset in the library it was last in, reading its metadata again. Answers 400 when that account is unknown or gone and 409 when its library already holds the file.",
        "operationId": "restoreFileTrashItem",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FileTrashRestoreResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Restore a file from the file trash",
        "tags": [
          "File trash (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "maintenance"
      }
    },
    "/admin/integrity/report": {
      "get": {
        "description": "Get all flagged items by integrity report type",
        "operationId": "getIntegrityReport",
        "parameters": [
          {
            "name": "cursor",
            "required": false,
            "in": "query",
            "description": "Cursor for pagination",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Number of items per page",
            "schema": {
              "maximum": 9007199254740991,
              "exclusiveMinimum": true,
              "default": 500,
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "type",
            "required": true,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/IntegrityReport"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrityReportResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get integrity report by type",
        "tags": [
          "Maintenance (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "maintenance"
      }
    },
    "/admin/integrity/report/{id}": {
      "delete": {
        "description": "Delete a given report item and perform corresponding deletion (e.g. trash asset, delete file)",
        "operationId": "deleteIntegrityReport",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete integrity report item",
        "tags": [
          "Maintenance (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "maintenance"
      }
    },
    "/admin/integrity/report/{id}/file": {
      "get": {
        "description": "Download the untracked/broken file if one exists",
        "operationId": "getIntegrityReportFile",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Download flagged file",
        "tags": [
          "Maintenance (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "maintenance"
      }
    },
    "/admin/integrity/report/{type}/csv": {
      "get": {
        "description": "Get all integrity report entries for a given type as a CSV",
        "operationId": "getIntegrityReportCsv",
        "parameters": [
          {
            "name": "type",
            "required": true,
            "in": "path",
            "schema": {
              "$ref": "#/components/schemas/IntegrityReport"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Export integrity report by type as CSV",
        "tags": [
          "Maintenance (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "maintenance"
      }
    },
    "/admin/integrity/runs": {
      "get": {
        "description": "Get when each integrity check last completed a full run",
        "operationId": "getIntegrityCheckRuns",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrityCheckRunsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get integrity check runs",
        "tags": [
          "Maintenance (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "maintenance"
      }
    },
    "/admin/integrity/summary": {
      "get": {
        "description": "Get a count of the items flagged in each integrity report",
        "operationId": "getIntegrityReportSummary",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrityReportSummaryResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get integrity report summary",
        "tags": [
          "Maintenance (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "maintenance"
      }
    },
    "/admin/maintenance/detect-install": {
      "get": {
        "description": "Collect integrity checks and other heuristics about local data.",
        "operationId": "detectPriorInstall",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaintenanceDetectInstallResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Detect existing install",
        "tags": [
          "Maintenance (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "maintenance"
      }
    },
    "/admin/maintenance/login": {
      "post": {
        "description": "Login with maintenance token or cookie to receive current information and perform further actions.",
        "operationId": "maintenanceLogin",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MaintenanceLoginDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaintenanceAuthDto"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Log into maintenance mode",
        "tags": [
          "Maintenance (admin)"
        ],
        "security": []
      }
    },
    "/admin/maintenance/status": {
      "get": {
        "description": "Fetch information about the currently running maintenance action.",
        "operationId": "getMaintenanceStatus",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaintenanceStatusResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Get maintenance mode status",
        "tags": [
          "Maintenance (admin)"
        ],
        "security": []
      }
    },
    "/admin/notifications": {
      "post": {
        "description": "Create a new notification for a specific user.",
        "operationId": "createNotification",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NotificationCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a notification",
        "tags": [
          "Notifications (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "all"
      }
    },
    "/admin/notifications/templates/{name}": {
      "post": {
        "description": "Retrieve a preview of the provided email template.",
        "operationId": "getNotificationTemplateAdmin",
        "parameters": [
          {
            "name": "name",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TemplateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TemplateResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Render email template",
        "tags": [
          "Notifications (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "all"
      }
    },
    "/admin/notifications/test-email": {
      "post": {
        "description": "Send a test email using the provided SMTP configuration.",
        "operationId": "sendTestEmailAdmin",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminConfigSmtpDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestEmailResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Send test email",
        "tags": [
          "Notifications (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "all"
      }
    },
    "/admin/physical-deduplication/applies/{id}/restore": {
      "post": {
        "description": "Point one copy back at its own former file, only while that file is still on disk with the reviewed checksum and size, and answer with the plan verified again. A copy whose own file was removed cannot be restored.",
        "operationId": "restorePhysicalDeduplicationCopy",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhysicalDeduplicationRestoreRequestDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhysicalDeduplicationVerificationDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Restore a copy of an applied physical deduplication plan",
        "tags": [
          "Maintenance (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "job.create"
      }
    },
    "/admin/physical-deduplication/applies/{id}/verify": {
      "post": {
        "description": "Hash every retained original the applied plan shares again and check that every copy it changed still resolves to one. Reports, per copy, whether its own former file is gone (which cannot be undone) or still on disk (which can be restored). Nothing is written.",
        "operationId": "verifyPhysicalDeduplicationApply",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhysicalDeduplicationVerificationDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Verify an applied physical deduplication plan",
        "tags": [
          "Maintenance (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "job.read"
      }
    },
    "/admin/physical-deduplication/plan/review": {
      "post": {
        "description": "Check the plan on screen against the library again and bind the per-group decisions to it. Answers 409 when a newer preview replaced the plan, it was applied, or any checksum, ownership, path or reference evidence changed. Nothing is written.",
        "operationId": "reviewPhysicalDeduplicationPlan",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhysicalDeduplicationReviewRequestDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhysicalDeduplicationReviewResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Review a physical deduplication plan",
        "tags": [
          "Maintenance (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "job.create"
      }
    },
    "/admin/physical-deduplication/preview": {
      "get": {
        "description": "Return the latest physical deduplication plan with per-copy evidence, and the plans being applied or applied recently. Thumbnail visibility is the asset access of the requesting administrator, evaluated on every read.",
        "operationId": "getPhysicalDeduplicationPreview",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhysicalDeduplicationPreviewResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get physical deduplication preview",
        "tags": [
          "Maintenance (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "job.read"
      },
      "post": {
        "description": "Queue a dry run that may retain originals in an account chosen for the preview and may review the copies of one account. Applying needs a reviewed plan and the saved master account.",
        "operationId": "requestPhysicalDeduplicationPreview",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhysicalDeduplicationPreviewRequestDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Request physical deduplication preview",
        "tags": [
          "Maintenance (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "job.create"
      }
    },
    "/admin/users/{id}/calendar-heatmap": {
      "get": {
        "description": "Retrieve activity counts for a specified period, in a calendar heatmap format.",
        "operationId": "getUserCalendarHeatmapAdmin",
        "parameters": [
          {
            "name": "from",
            "required": false,
            "in": "query",
            "description": "Start date in UTC",
            "schema": {
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
              "example": "2024-01-01",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "to",
            "required": false,
            "in": "query",
            "description": "End date in UTC",
            "schema": {
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
              "example": "2024-01-01",
              "type": "string"
            }
          },
          {
            "name": "type",
            "required": false,
            "in": "query",
            "schema": {
              "default": "Upload",
              "$ref": "#/components/schemas/CalendarHeatmapType"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CalendarHeatmapResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve calendar heatmap activity",
        "tags": [
          "Users (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "adminUser.read"
      }
    },
    "/admin/users/{id}/pin-code": {
      "get": {
        "description": "Retrieve whether a specific user has a PIN code set, never the PIN itself.",
        "operationId": "getUserPinCodeStateAdmin",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserAdminPinCodeStateResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve whether a user has a PIN",
        "tags": [
          "Users (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "adminUser.read"
      }
    },
    "/admin/users/{id}/preferences": {
      "get": {
        "description": "Retrieve the preferences of a specific user.",
        "operationId": "getUserPreferencesAdmin",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserPreferencesResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve user preferences",
        "tags": [
          "Users (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "adminUser.read"
      },
      "put": {
        "deprecated": true,
        "description": "Update the preferences of a specific user.",
        "operationId": "updateUserPreferencesAdmin",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserPreferencesUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserPreferencesResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update user preferences",
        "tags": [
          "Users (admin)",
          "Deprecated"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "adminUser.update"
      }
    },
    "/admin/users/{id}/sessions": {
      "get": {
        "description": "Retrieve all sessions for a specific user.",
        "operationId": "getUserSessionsAdmin",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/SessionResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve user sessions",
        "tags": [
          "Users (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "adminSession.read"
      }
    },
    "/admin/users/{id}/sessions/{sessionId}": {
      "delete": {
        "description": "Delete a specific session for a specific user, signing that device out.",
        "operationId": "deleteUserSessionAdmin",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "sessionId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "`SessionService.delete` only checks `Permission.AuthDeviceDelete` over the caller's\nown sessions, so an administrator could never revoke a foreign session through it. This is\nthe explicit, audited admin path the account detail's Security tab needs instead.",
        "tags": [
          "Users (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "adminSession.delete"
      }
    },
    "/admin/users/{id}/statistics": {
      "get": {
        "description": "Retrieve asset statistics for a specific user.",
        "operationId": "getUserStatisticsAdmin",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "isFavorite",
            "required": false,
            "in": "query",
            "description": "Filter by favorite status",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isTrashed",
            "required": false,
            "in": "query",
            "description": "Filter by trash status",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "visibility",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/AssetVisibility"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetStatsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve user statistics",
        "tags": [
          "Users (admin)"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "adminUser.read"
      }
    },
    "/album-sources": {
      "get": {
        "description": "List your phone albums and folders linked to server albums.",
        "operationId": "getAlbumSourceLinks",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AlbumSourceLinkResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List album source links",
        "tags": [
          "Album sources"
        ],
        "x-frameleaf-permission": "album.read"
      }
    },
    "/album-sources/resolve": {
      "post": {
        "description": "For each phone album or folder, return its linked server album; otherwise link it to your oldest album with the same trimmed, case-insensitive name, or create an album. Never creates two albums for one source, also with several devices resolving at once.",
        "operationId": "resolveAlbumSources",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AlbumSourceResolveDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlbumSourceResolveResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Resolve album sources",
        "tags": [
          "Album sources"
        ],
        "x-frameleaf-permission": "album.create"
      }
    },
    "/album-sources/{id}": {
      "delete": {
        "description": "Unlink the phone album or folder. The server album and its photos are kept.",
        "operationId": "deleteAlbumSourceLink",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete an album source link",
        "tags": [
          "Album sources"
        ],
        "x-frameleaf-permission": "album.update"
      },
      "patch": {
        "description": "Record the source’s new name on the phone, renaming the server album only while its name still equals the name it last followed. An optional sourceId re-keys the link (409 when another link holds it).",
        "operationId": "updateAlbumSourceLink",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AlbumSourceUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlbumSourceUpdateResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update an album source link",
        "tags": [
          "Album sources"
        ],
        "x-frameleaf-permission": "album.update"
      }
    },
    "/album-sources/{id}/assets": {
      "delete": {
        "description": "Take out only the album memberships this link's sync added. Assets are never deleted, trashed or hidden, and memberships added by hand or still recorded by another link stay.",
        "operationId": "removeAlbumSourceAssets",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkIdsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/BulkIdResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Remove assets through an album source link",
        "tags": [
          "Album sources"
        ],
        "x-frameleaf-permission": "albumAsset.delete"
      },
      "post": {
        "description": "Add assets to the linked album and record that the sync added them. Idempotent; an asset already in the album by hand is reported as a duplicate and never recorded.",
        "operationId": "addAlbumSourceAssets",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkIdsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/BulkIdResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Add assets through an album source link",
        "tags": [
          "Album sources"
        ],
        "x-frameleaf-permission": "albumAsset.create"
      }
    },
    "/albums": {
      "get": {
        "description": "Retrieve a list of albums available to the authenticated user.",
        "operationId": "getAllAlbums",
        "parameters": [
          {
            "name": "assetId",
            "required": false,
            "in": "query",
            "description": "Filter albums containing this asset ID (ignores other parameters)",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": false,
            "in": "query",
            "description": "Album ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "isOwned",
            "required": false,
            "in": "query",
            "description": "Filter by ownership: true = only owned, false = only shared-with-me, undefined = no filter",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isShared",
            "required": false,
            "in": "query",
            "description": "Filter by shared status: true = only shared, false = not shared, undefined = no filter",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "name",
            "required": false,
            "in": "query",
            "description": "Album name (exact match)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "suppressedOnly",
            "required": false,
            "in": "query",
            "description": "Return album metadata for suppressed content only",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AlbumResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List all albums",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.read"
      },
      "post": {
        "description": "Create a new album. The album can also be created with initial users and assets.",
        "operationId": "createAlbum",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateAlbumDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlbumResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create an album",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.create"
      }
    },
    "/albums/assets": {
      "put": {
        "description": "Send a list of asset IDs and album IDs to add each asset to each album.",
        "operationId": "addAssetsToAlbums",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AlbumsAddAssetsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlbumsAddAssetsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Add assets to albums",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "albumAsset.create"
      }
    },
    "/albums/icons": {
      "get": {
        "description": "Every Material Design Icons name an album or collection may use, plus the categorised suggested set shown first in icon choosers. Served as data so clients never bundle the catalogue.",
        "operationId": "getAlbumIconCatalogue",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlbumIconCatalogueResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve the album icon catalogue",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.read"
      }
    },
    "/albums/order": {
      "put": {
        "description": "Save the authenticated user's own custom order for one group of their album directory: the albums inside a collection, or at the top level the collections, the albums on their own, or the shared spaces. The order is personal and changes organization only; access and membership are untouched. The ids must be exactly the group as it is now, otherwise 409.",
        "operationId": "setAlbumOrder",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AlbumOrderDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Arrange a group of the album directory",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.update"
      }
    },
    "/albums/statistics": {
      "get": {
        "description": "Returns statistics about the albums available to the authenticated user.",
        "operationId": "getAlbumStatistics",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlbumStatisticsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve album statistics",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.statistics"
      }
    },
    "/albums/tree": {
      "get": {
        "description": "Collections with their albums, albums that stand on their own, and shared spaces, for everything the authenticated user owns or is shared with. Albums nest one level deep inside collections only; collections and shared spaces are always top level.",
        "operationId": "getAlbumTree",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlbumTreeResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve the album directory",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.read"
      }
    },
    "/albums/{id}": {
      "delete": {
        "description": "Delete a specific album by its ID. Note the album is initially trashed and then immediately scheduled for deletion, but relies on a background job to complete the process.",
        "operationId": "deleteAlbum",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete an album",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.delete"
      },
      "get": {
        "description": "Retrieve information about a specific album by its ID.",
        "operationId": "getAlbumInfo",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "suppressedOnly",
            "required": false,
            "in": "query",
            "description": "Return album metadata for suppressed content only",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlbumResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve an album",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.read"
      },
      "patch": {
        "description": "Update the information of a specific album by its ID. This endpoint can be used to update the album name, description, sort order, etc. However, it is not used to add or remove assets or users from the album.",
        "operationId": "updateAlbumInfo",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateAlbumDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlbumResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update an album",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.update"
      }
    },
    "/albums/{id}/assets": {
      "delete": {
        "description": "Remove multiple assets from a specific album by its ID.",
        "operationId": "removeAssetFromAlbum",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkIdsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/BulkIdResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Remove assets from an album",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "albumAsset.delete"
      },
      "put": {
        "description": "Add multiple assets to a specific album by its ID.",
        "operationId": "addAssetsToAlbum",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkIdsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/BulkIdResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Add assets to an album",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "albumAsset.create"
      }
    },
    "/albums/{id}/collection": {
      "put": {
        "description": "Move an album into a collection, or send null to take it out so it stands on its own. Only the album owner can move it (an editor gets 403); the destination must be a collection the user can edit. Collections and shared spaces cannot be moved.",
        "operationId": "moveAlbumToCollection",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MoveAlbumDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlbumResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Move an album into or out of a collection",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.update"
      }
    },
    "/albums/{id}/descendant-count": {
      "get": {
        "description": "Return the number of descendant albums (children, grandchildren, etc.) for a specific album. Used by the UI to show \"Delete X and N nested albums?\" confirmations.",
        "operationId": "getAlbumDescendantCount",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlbumDescendantCountResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Count descendant albums",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.read"
      }
    },
    "/albums/{id}/map-markers": {
      "get": {
        "description": "Retrieve map marker information for a specific album by its ID.",
        "operationId": "getAlbumMapMarkers",
        "parameters": [
          {
            "name": "fileCreatedAfter",
            "required": false,
            "in": "query",
            "description": "Filter assets created after this date",
            "schema": {
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
              "example": "2024-01-01T00:00:00.000Z",
              "type": "string"
            }
          },
          {
            "name": "fileCreatedBefore",
            "required": false,
            "in": "query",
            "description": "Filter assets created before this date",
            "schema": {
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
              "example": "2024-01-01T00:00:00.000Z",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "isArchived",
            "required": false,
            "in": "query",
            "description": "Include archived items (the album default); false leaves them out",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isFavorite",
            "required": false,
            "in": "query",
            "description": "Filter by the viewer's own favorites; other members' favorites are never matched",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "withPartners",
            "required": false,
            "in": "query",
            "description": "Include the album's items owned by anyone else (the album default); false keeps only your own",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "withSharedAlbums",
            "required": false,
            "in": "query",
            "description": "Accepted for the shared map settings; has no effect on an album map",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/MapMarkerResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve album map markers",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.read"
      }
    },
    "/albums/{id}/user/{userId}": {
      "delete": {
        "description": "Remove a user from an album. Use an ID of \"me\" to leave a shared album.",
        "operationId": "removeUserFromAlbum",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Album ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "userId",
            "required": true,
            "in": "path",
            "description": "Album user ID, or \"me\" to reference the current user.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Remove user from album",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "albumUser.delete"
      },
      "put": {
        "description": "Change the role for a specific user in a specific album.",
        "operationId": "updateAlbumUser",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Album ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "userId",
            "required": true,
            "in": "path",
            "description": "Album user ID, or \"me\" to reference the current user.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateAlbumUserDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update user role",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "albumUser.update"
      }
    },
    "/albums/{id}/users": {
      "put": {
        "description": "Share an album with multiple users. Each user can be given a specific role in the album.",
        "operationId": "addUsersToAlbum",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddUsersDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlbumResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Share album with users",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "albumUser.create"
      }
    },
    "/analytics": {
      "get": {
        "description": "Counts, sizes, dated history and processing outcomes for one selection and date range. Series that are not recorded for the selection are omitted or null, never filled in; estimated processing cost is an estimate, not a charge.",
        "operationId": "getAnalyticsReport",
        "parameters": [
          {
            "name": "range",
            "required": false,
            "in": "query",
            "schema": {
              "default": "year",
              "$ref": "#/components/schemas/AnalyticsRange"
            }
          },
          {
            "name": "scope",
            "required": false,
            "in": "query",
            "description": "`all` (the whole server, administrators only), `account:<id>` or `library:<id>`",
            "schema": {
              "default": "all",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnalyticsReportResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve library analytics",
        "tags": [
          "Analytics"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/analytics/scopes": {
      "get": {
        "description": "The selections the signed-in account may read analytics for: the whole server for administrators, then accounts and external libraries.",
        "operationId": "getAnalyticsScopes",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnalyticsScopesResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List analytics scopes",
        "tags": [
          "Analytics"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/archive-operations": {
      "get": {
        "operationId": "getArchiveOperations",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/ArchiveOperationResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List recent archive operations",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.update"
      },
      "post": {
        "description": "Freezes the selection and hands it to a durable bulk job. Undo later restores only items nothing has changed since.",
        "operationId": "createArchiveOperation",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ArchiveOperationCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ArchiveOperationResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Archive a selection in the background",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/archive-operations/prepare": {
      "post": {
        "description": "Counts and freezes, in one transaction, every asset of your own normal Timeline this session can see. Nothing changes until the count is confirmed.",
        "operationId": "prepareArchiveOperation",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ArchiveOperationPrepareDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ArchiveOperationResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Count and freeze every matching Timeline asset",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/archive-operations/{id}": {
      "get": {
        "operationId": "getArchiveOperation",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ArchiveOperationResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve an archive operation",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/archive-operations/{id}/confirm": {
      "post": {
        "operationId": "confirmArchiveOperation",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ArchiveOperationConfirmDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ArchiveOperationResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Confirm a prepared archive selection",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/archive-operations/{id}/undo": {
      "post": {
        "description": "Restores, in the background, every item the archive changed that nothing has changed since. A running archive is stopped first.",
        "operationId": "undoArchiveOperation",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ArchiveOperationUndoDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ArchiveOperationResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Undo an archive operation",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/asset-files": {
      "get": {
        "description": "Returns all matching asset files.",
        "operationId": "searchAssetFiles",
        "parameters": [
          {
            "name": "assetId",
            "required": true,
            "in": "query",
            "description": "Asset ID to filter files by",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "isEdited",
            "required": false,
            "in": "query",
            "description": "The file was generated from an edit",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isProgressive",
            "required": false,
            "in": "query",
            "description": "The file is a progressively encoded JPEG",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isTransparent",
            "required": false,
            "in": "query",
            "description": "The file is transparent",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "type",
            "required": false,
            "in": "query",
            "description": "Filter by type of file",
            "schema": {
              "$ref": "#/components/schemas/AssetFileType"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AssetFileResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Search asset files",
        "tags": [
          "Asset files"
        ],
        "x-frameleaf-permission": "assetFile.read"
      }
    },
    "/asset-files/{id}": {
      "delete": {
        "description": "Delete a file and remove it from the database.",
        "operationId": "deleteAssetFile",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete an asset file",
        "tags": [
          "Asset files"
        ],
        "x-frameleaf-permission": "assetFile.delete"
      },
      "get": {
        "description": "Returns metadata about a specific asset file.",
        "operationId": "getAssetFile",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetFileResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve an asset file",
        "tags": [
          "Asset files"
        ],
        "x-frameleaf-permission": "assetFile.read"
      }
    },
    "/asset-files/{id}/download": {
      "get": {
        "description": "Serve the contents of a specific asset file.",
        "operationId": "downloadAssetFile",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Download an asset file",
        "tags": [
          "Asset files"
        ],
        "x-frameleaf-permission": "assetFile.download"
      }
    },
    "/assets": {
      "delete": {
        "description": "Deletes multiple assets at the same time.",
        "operationId": "deleteAssets",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetBulkDeleteDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete assets",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.delete"
      },
      "post": {
        "description": "Uploads a new asset to the server.",
        "operationId": "uploadAsset",
        "parameters": [
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AssetMediaCreateDto"
              }
            }
          },
          "description": "Asset Upload Information",
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetMediaResponseDto"
                }
              }
            },
            "description": "Asset is a duplicate"
          },
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetMediaResponseDto"
                }
              }
            },
            "description": "Asset uploaded successfully"
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Upload asset",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      },
      "put": {
        "deprecated": true,
        "description": "Updates multiple assets at the same time.",
        "operationId": "updateAssets",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetBulkUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update assets",
        "tags": [
          "Assets",
          "Deprecated"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/assets/bulk-upload-check": {
      "post": {
        "description": "Determine which assets have already been uploaded to the server based on their SHA1 checksums.",
        "operationId": "checkBulkUpload",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetBulkUploadCheckDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetBulkUploadCheckResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Check bulk upload",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/assets/copy": {
      "put": {
        "description": "Copy asset information like albums, tags, etc. from one asset to another.",
        "operationId": "copyAsset",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetCopyDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Copy asset",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.copy"
      }
    },
    "/assets/jobs": {
      "post": {
        "description": "Run a specific job on a set of assets.",
        "operationId": "runAssetJobs",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetJobsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Run an asset job",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "job.create"
      }
    },
    "/assets/lock": {
      "post": {
        "description": "Locks assets: they keep their albums and organization, are hidden from every view except the Locked view of their owner in a PIN-unlocked session, and stacks and live photos lock as a whole.",
        "operationId": "lockAssets",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkIdsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Lock assets",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/assets/metadata": {
      "delete": {
        "description": "Delete metadata key-value pairs for multiple assets.",
        "operationId": "deleteBulkAssetMetadata",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetMetadataBulkDeleteDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete asset metadata",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.update"
      },
      "put": {
        "description": "Upsert metadata key-value pairs for multiple assets.",
        "operationId": "updateBulkAssetMetadata",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetMetadataBulkUpsertDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AssetMetadataBulkResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Upsert asset metadata",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/assets/statistics": {
      "get": {
        "description": "Retrieve various statistics about the assets owned by the authenticated user.",
        "operationId": "getAssetStatistics",
        "parameters": [
          {
            "name": "isFavorite",
            "required": false,
            "in": "query",
            "description": "Filter by favorite status",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isTrashed",
            "required": false,
            "in": "query",
            "description": "Filter by trash status",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "visibility",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/AssetVisibility"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetStatsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get asset statistics",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.statistics"
      }
    },
    "/assets/unlock": {
      "post": {
        "description": "Unlocks assets the caller owns, whatever locked them, returning each exactly where it was. Requires a PIN-unlocked session.",
        "operationId": "unlockAssets",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkIdsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Unlock assets",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/assets/uploads": {
      "options": {
        "operationId": "getAssetUploadResourceLimits",
        "parameters": [],
        "responses": {
          "204": {
            "description": "Resumable upload limits"
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get resumable asset upload limits",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      },
      "post": {
        "description": "IETF resumable upload draft 12 / interop 9 prerequisite. Single resources publish by default; explicitly declared Live Photo resources stay private until pair commit.",
        "operationId": "createAssetUploadResource",
        "parameters": [
          {
            "name": "Asset-Metadata",
            "in": "header",
            "description": "Canonical base64url UTF-8 JSON: filename, fileCreatedAt, fileModifiedAt; optional duration (integer milliseconds), isFavorite (JSON boolean; the strings \"true\" and \"false\" are also accepted), visibility, metadata array and publication: live-photo to defer publication until atomic pair commit. No sidecar or pre-existing asset references.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Repr-Digest",
            "in": "header",
            "description": "RFC 9530 single sha-256=:base64: digest of the entire file, required before any publication",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Upload-Complete",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "?0",
                "?1"
              ]
            }
          },
          {
            "name": "Upload-Draft-Interop-Version",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "9"
              ]
            }
          },
          {
            "name": "Upload-Length",
            "in": "header",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 2147483648
            }
          }
        ],
        "requestBody": {
          "content": {
            "audio/*": {
              "schema": {
                "format": "binary",
                "type": "string"
              }
            },
            "image/*": {
              "schema": {
                "format": "binary",
                "type": "string"
              }
            },
            "video/*": {
              "schema": {
                "format": "binary",
                "type": "string"
              }
            }
          },
          "required": true
        },
        "responses": {
          "104": {
            "description": "Committed private upload resource exists; Location identifies resumable state"
          },
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetUploadResultDto"
                }
              }
            },
            "description": ""
          },
          "201": {
            "description": "Private upload resource created, incomplete bytes are never an asset"
          },
          "202": {
            "description": "Complete bytes verified; ingestion remains pending"
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create resumable asset upload",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/assets/uploads/live-photo/commit": {
      "post": {
        "operationId": "commitLivePhotoUpload",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LivePhotoUploadCommitDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LivePhotoUploadResultDto"
                }
              }
            },
            "description": ""
          },
          "202": {
            "description": "Both assets committed atomically; required ingestion remains pending"
          },
          "409": {
            "description": "Incompatible pair, existing unrelated duplicate, or concurrent request"
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Commit two verified Live Photo upload resources atomically",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/assets/uploads/{id}": {
      "delete": {
        "operationId": "cancelAssetUploadResource",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Upload cancelled"
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Cancel an unpublished upload",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      },
      "head": {
        "operationId": "getAssetUploadResourceOffset",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Durable acknowledged offset; completion only after final processing",
            "headers": {
              "Upload-Complete": {
                "schema": {
                  "enum": [
                    "?0",
                    "?1"
                  ],
                  "type": "string"
                }
              },
              "Upload-Offset": {
                "schema": {
                  "minimum": 0,
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get durable upload offset",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      },
      "patch": {
        "operationId": "appendAssetUploadResource",
        "parameters": [
          {
            "name": "Upload-Complete",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "?0",
                "?1"
              ]
            }
          },
          {
            "name": "Upload-Draft-Interop-Version",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "9"
              ]
            }
          },
          {
            "name": "Upload-Offset",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/partial-upload": {
              "schema": {
                "format": "binary",
                "type": "string"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetUploadResultDto"
                }
              }
            },
            "description": ""
          },
          "202": {
            "description": "Same upload is pending final ingestion; retry empty completion at the durable offset"
          },
          "204": {
            "description": "Immutable append durably acknowledged",
            "headers": {
              "Upload-Complete": {
                "schema": {
                  "enum": [
                    "?0",
                    "?1"
                  ],
                  "type": "string"
                }
              },
              "Upload-Offset": {
                "schema": {
                  "minimum": 0,
                  "type": "integer"
                }
              }
            }
          },
          "409": {
            "description": "Offset or state conflict; HEAD returns the durable acknowledged offset"
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Append immutable upload bytes",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/assets/uploads/{id}/result": {
      "get": {
        "operationId": "getAssetUploadResourceResult",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetUploadResultDto"
                }
              }
            },
            "description": ""
          },
          "202": {
            "description": "Ingestion pending; retry this same resource"
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Recover a completed upload result",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/assets/{id}": {
      "get": {
        "description": "Retrieve detailed information about a specific asset.",
        "operationId": "getAssetInfo",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve an asset",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.read"
      },
      "put": {
        "deprecated": true,
        "description": "Update information of a specific asset.",
        "operationId": "updateAsset",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateAssetDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update an asset",
        "tags": [
          "Assets",
          "Deprecated"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/assets/{id}/develop": {
      "get": {
        "description": "Every saved still-image edit recipe for the asset, newest first, with its render state and which one is current.",
        "operationId": "getAssetDevelop",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetDevelopResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List develop versions of an asset",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.get"
      },
      "put": {
        "description": "Stores the recipe as the next revision of the asset and, by default, queues the edited master render. The original file is never changed.",
        "operationId": "saveAssetDevelop",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetDevelopSaveDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetDevelopRevisionResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Save a develop recipe as a new version",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.create"
      }
    },
    "/assets/{id}/develop/artifacts": {
      "post": {
        "description": "keeps a subject, sky or background mask bitmap (greyscale, covering the whole original) or a Clean Up fill (RGBA, covering its area) that a client computed for this photo. Recipes reference it by the returned id, the SHA-256 of the stored PNG, so every client and the server render the same result. Uploading the same bitmap again returns the same id. A recipe that references an artifact this photo does not have is refused with `develop_artifact_missing`.",
        "operationId": "uploadAssetDevelopArtifact",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AssetDevelopArtifactUploadDto"
              }
            }
          },
          "description": "A mask bitmap or a generated fill for this photo",
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetDevelopArtifactResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Upload a develop artifact",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.create"
      }
    },
    "/assets/{id}/develop/exports": {
      "get": {
        "description": "Every recorded export of the original, newest first, and whether the original still matches it.",
        "operationId": "getAssetDevelopExports",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/DevelopExportResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List exports of an original for editing elsewhere",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.get"
      },
      "post": {
        "description": "Records the SHA-256 of the original now, so a file developed from it in another application can be brought back and checked. Download the original through the ordinary download route.",
        "operationId": "createAssetDevelopExport",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DevelopExportResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Export an original for editing elsewhere",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.create"
      }
    },
    "/assets/{id}/develop/imports": {
      "post": {
        "description": "Checks that the file arrived intact and was developed from the original the photo has now, then keeps it as a new version and renders its preview. Nothing is kept when a check fails; the original is never changed.",
        "operationId": "importAssetDevelopRendition",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AssetDevelopImportDto"
              }
            }
          },
          "description": "The developed file and the original it was made from",
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetDevelopRevisionResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Bring back a file developed elsewhere",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.create"
      }
    },
    "/assets/{id}/develop/masks/propose": {
      "post": {
        "operationId": "proposeAssetDevelopMask",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetDevelopSemanticMaskDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetDevelopArtifactResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Suggest a subject or sky mask locally",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.create"
      }
    },
    "/assets/{id}/develop/preview": {
      "post": {
        "description": "Renders the recipe from the original at preview size and returns the image; nothing is stored.",
        "operationId": "previewAssetDevelop",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetDevelopPreviewDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Render a develop preview",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.get"
      }
    },
    "/assets/{id}/develop/revert": {
      "post": {
        "description": "Makes the named rendered version current, or the original when no version is named. History and files are kept.",
        "operationId": "revertAssetDevelop",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetDevelopRevertDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetDevelopResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Revert to the original or an earlier develop version",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.create"
      }
    },
    "/assets/{id}/develop/revisions/{revisionId}/file": {
      "get": {
        "description": "Streams the edited master or the preview rendered for the version.",
        "operationId": "viewAssetDevelopFile",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Asset ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "kind",
            "required": false,
            "in": "query",
            "schema": {
              "default": "preview",
              "$ref": "#/components/schemas/AssetDevelopFileKind"
            }
          },
          {
            "name": "revisionId",
            "required": true,
            "in": "path",
            "description": "Develop revision ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "View a rendered develop file",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.get"
      }
    },
    "/assets/{id}/develop/revisions/{revisionId}/render": {
      "delete": {
        "description": "Stops a queued or running render of the version. Files already rendered for other versions are untouched.",
        "operationId": "cancelAssetDevelopRender",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Asset ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "revisionId",
            "required": true,
            "in": "path",
            "description": "Develop revision ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetDevelopRevisionResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Cancel a develop render",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.create"
      },
      "post": {
        "description": "Queues (or re-queues after a failure or cancellation) the edited master render of a saved version.",
        "operationId": "renderAssetDevelopRevision",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Asset ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "revisionId",
            "required": true,
            "in": "path",
            "description": "Develop revision ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetDevelopRevisionResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Render a develop version",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.create"
      }
    },
    "/assets/{id}/edit-versions": {
      "get": {
        "operationId": "getVideoEditVersions",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/VideoEditVersionResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List saved video versions",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.get"
      }
    },
    "/assets/{id}/edit-versions/export": {
      "post": {
        "operationId": "exportVideoEditVersion",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VideoEditExportDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VideoEditVersionResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Export the current video version",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.create"
      }
    },
    "/assets/{id}/edit-versions/{versionId}": {
      "delete": {
        "operationId": "pruneVideoEditVersion",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          },
          {
            "name": "versionId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Prune an unselected video version",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.delete"
      }
    },
    "/assets/{id}/edit-versions/{versionId}/download": {
      "get": {
        "operationId": "downloadVideoEditVersion",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          },
          {
            "name": "versionId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Download a video version master",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.download"
      }
    },
    "/assets/{id}/edit-versions/{versionId}/restore": {
      "post": {
        "operationId": "restoreVideoEditVersion",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          },
          {
            "name": "versionId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Restore a saved video version",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.create"
      }
    },
    "/assets/{id}/edits": {
      "delete": {
        "description": "Removes all edit actions (crop, rotate, mirror) associated with the specified asset.",
        "operationId": "removeAssetEdits",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Remove edits from an existing asset",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.delete"
      },
      "get": {
        "description": "Retrieve a series of edit actions (crop, rotate, mirror) associated with the specified asset.",
        "operationId": "getAssetEdits",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetEditsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve edits for an existing asset",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.get"
      },
      "put": {
        "description": "Apply a series of edit actions (crop, rotate, mirror) to the specified asset.",
        "operationId": "editAsset",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetEditsCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetEditsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Apply edits to an existing asset",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.create"
      }
    },
    "/assets/{id}/edits/keyframes": {
      "get": {
        "description": "The keyframe times of the original video, so an editor can show where a fast (keyframe) trim actually cuts. Owner's edit permission only; never the edited version.",
        "operationId": "getAssetEditKeyframes",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetEditKeyframesResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List the original video's keyframes",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.get"
      }
    },
    "/assets/{id}/image-enrichment": {
      "get": {
        "description": "Retrieve private image description, tag, and NSFW detection metadata for a specific asset.",
        "operationId": "getAssetImageEnrichment",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetImageEnrichmentResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get image enrichment metadata",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.update"
      },
      "put": {
        "description": "Run repair actions for generated image descriptions, tags, and NSFW detection metadata.",
        "operationId": "updateAssetImageEnrichment",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetImageEnrichmentActionRequestDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetImageEnrichmentResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update image enrichment metadata",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/assets/{id}/metadata": {
      "get": {
        "description": "Retrieve all metadata key-value pairs associated with the specified asset.",
        "operationId": "getAssetMetadata",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AssetMetadataResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get asset metadata",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.read"
      },
      "put": {
        "description": "Update or add metadata key-value pairs for the specified asset.",
        "operationId": "updateAssetMetadata",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetMetadataUpsertDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AssetMetadataResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update asset metadata",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/assets/{id}/metadata/{key}": {
      "delete": {
        "description": "Delete a specific metadata key-value pair associated with the specified asset.",
        "operationId": "deleteAssetMetadata",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Asset ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "key",
            "required": true,
            "in": "path",
            "description": "Metadata key",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete asset metadata by key",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.update"
      },
      "get": {
        "description": "Retrieve the value of a specific metadata key associated with the specified asset.",
        "operationId": "getAssetMetadataByKey",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Asset ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "key",
            "required": true,
            "in": "path",
            "description": "Metadata key",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetMetadataResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve asset metadata by key",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/assets/{id}/ocr": {
      "get": {
        "description": "Retrieve all OCR (Optical Character Recognition) data associated with the specified asset.",
        "operationId": "getAssetOcr",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AssetOcrResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve asset OCR data",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/assets/{id}/original": {
      "get": {
        "description": "Downloads the original file of the specified asset.",
        "operationId": "downloadAsset",
        "parameters": [
          {
            "name": "edited",
            "required": false,
            "in": "query",
            "description": "Return edited asset if available",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Download original asset",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.download"
      }
    },
    "/assets/{id}/restorations/{restorationId}": {
      "delete": {
        "description": "Cancels anything still running, stops using the result for playback and removes every file the restoration produced. The record stays as history.",
        "operationId": "discardAssetRestoration",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Asset ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "restorationId",
            "required": true,
            "in": "path",
            "description": "Restoration ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Discard a restoration",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.create"
      }
    },
    "/assets/{id}/restorations/{restorationId}/file": {
      "get": {
        "description": "Streams the preview input, the restored preview, the full result or its playback rendition.",
        "operationId": "viewAssetRestorationFile",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Asset ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "kind",
            "required": false,
            "in": "query",
            "schema": {
              "default": "after",
              "$ref": "#/components/schemas/AssetRestorationFileKind"
            }
          },
          {
            "name": "restorationId",
            "required": true,
            "in": "path",
            "description": "Restoration ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "View a restoration file",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.edit.get"
      }
    },
    "/assets/{id}/thumbnail": {
      "get": {
        "description": "Retrieve the thumbnail image for the specified asset. Viewing the fullsize thumbnail might redirect to downloadAsset, which requires a different permission.",
        "operationId": "viewAsset",
        "parameters": [
          {
            "name": "edited",
            "required": false,
            "in": "query",
            "description": "Return edited asset if available",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "faceSource",
            "required": false,
            "in": "query",
            "description": "Return the ordinary edited preview used for face coordinates",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "size",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/AssetMediaSize"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "View asset thumbnail",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.view"
      }
    },
    "/assets/{id}/video/playback": {
      "get": {
        "description": "Streams the video file for the specified asset. This endpoint also supports byte range requests.",
        "operationId": "playAssetVideo",
        "parameters": [
          {
            "name": "edited",
            "required": false,
            "in": "query",
            "description": "Play the edited version when one exists (default). false plays the unedited source for the asset's owner, as the quick editor needs; everyone else is always given the edited version",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Play asset video",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.view"
      }
    },
    "/assets/{id}/video/stream/main.m3u8": {
      "get": {
        "description": "Returns an HLS main playlist with all available variants for the asset.",
        "operationId": "getMainPlaylist",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/vnd.apple.mpegurl": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get HLS main playlist",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.view"
      }
    },
    "/assets/{id}/video/stream/{sessionId}": {
      "delete": {
        "description": "Releases server resources for the streaming session.",
        "operationId": "endSession",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sessionId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "End HLS streaming session",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.view"
      }
    },
    "/assets/{id}/video/stream/{sessionId}/{variantIndex}/playlist.m3u8": {
      "get": {
        "description": "Returns an HLS media playlist for one variant of the streaming session.",
        "operationId": "getMediaPlaylist",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sessionId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "variantIndex",
            "required": true,
            "in": "path",
            "schema": {
              "minimum": 0,
              "maximum": 9007199254740991,
              "type": "integer"
            }
          },
          {
            "name": "x-immich-hls-pos",
            "required": false,
            "in": "header",
            "schema": {
              "minimum": 0,
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/vnd.apple.mpegurl": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get HLS media playlist",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.view"
      }
    },
    "/assets/{id}/video/stream/{sessionId}/{variantIndex}/{filename}": {
      "get": {
        "description": "Streams an HLS init segment (init.mp4) or media segment (seg_N.m4s).",
        "operationId": "getSegment",
        "parameters": [
          {
            "name": "filename",
            "required": true,
            "in": "path",
            "schema": {
              "pattern": "^(init\\.mp4|seg_\\d+\\.m4s)$",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sessionId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "variantIndex",
            "required": true,
            "in": "path",
            "schema": {
              "minimum": 0,
              "maximum": 9007199254740991,
              "type": "integer"
            }
          },
          {
            "name": "x-immich-hls-msn",
            "required": false,
            "in": "header",
            "schema": {
              "minimum": 0,
              "maximum": 9007199254740991,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get HLS segment or init file",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.view"
      }
    },
    "/assets/{id}/video/studio-hdr": {
      "get": {
        "description": "streams the 10-bit AV1 intermediate that keeps an HDR video’s BT.2020 PQ or HLG signal, for the Studio editor. Not found until it has been made (placing the video in a Studio project queues it). Supports byte range requests.",
        "operationId": "playStudioHdrVideo",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Play the Studio HDR intermediate",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.view"
      }
    },
    "/best-photos": {
      "get": {
        "description": "Retrieve visible photo assets ranked by the locally computed Best Photos score.",
        "operationId": "getBestPhotos",
        "parameters": [
          {
            "name": "includeArchived",
            "required": false,
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 500,
              "default": 100,
              "type": "integer"
            }
          },
          {
            "name": "minScore",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 0,
              "maximum": 1,
              "format": "double",
              "type": "number"
            }
          },
          {
            "name": "page",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 9007199254740991,
              "default": 1,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BestPhotosResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve best photos",
        "tags": [
          "Views"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/classification/assets/{id}": {
      "get": {
        "description": "Which of your rules put this item in a smart album, added a tag to it or archived it.",
        "operationId": "getAssetClassifications",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/ClassificationContributionDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve classification contributions for an asset",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/classification/preview": {
      "post": {
        "description": "What a draft rule matches, without writing anything. Rules with visual categories are previewed over a bounded sample of your newest items.",
        "operationId": "previewClassificationRule",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClassificationPreviewDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassificationPreviewResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Preview a classification rule",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.read"
      }
    },
    "/classification/rules": {
      "get": {
        "description": "Your smart album rules, optionally only the one behind an album.",
        "operationId": "getClassificationRules",
        "parameters": [
          {
            "name": "albumId",
            "required": false,
            "in": "query",
            "description": "Only the rule behind this album",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/ClassificationRuleResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List classification rules",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.read"
      },
      "post": {
        "description": "Create a smart album and the rule that fills it. Nothing is matched until the rule is applied. Archiving matches requires `archiveConsent`.",
        "operationId": "createClassificationRule",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClassificationRuleCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassificationRuleResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a classification rule",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.create"
      }
    },
    "/classification/rules/{id}": {
      "delete": {
        "description": "Stop the rule. Its album stays as an ordinary album with everything in it.",
        "operationId": "deleteClassificationRule",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a classification rule",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.update"
      },
      "get": {
        "description": "One of your smart album rules and its counts.",
        "operationId": "getClassificationRule",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassificationRuleResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve a classification rule",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.read"
      },
      "patch": {
        "description": "Change what the rule matches, what it does, or turn it off. A rule that is off keeps what it applied. Turning archiving on requires `archiveConsent`.",
        "operationId": "updateClassificationRule",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClassificationRuleUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassificationRuleResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update a classification rule",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.update"
      }
    },
    "/classification/rules/{id}/apply": {
      "post": {
        "description": "Apply the rule to up to 500 items from its plan. Larger plans run as an `apply-classification-rule` bulk media operation.",
        "operationId": "applyClassificationRule",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClassificationApplyDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassificationApplyResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Apply a classification rule",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.update"
      }
    },
    "/classification/rules/{id}/decisions": {
      "post": {
        "description": "Accept matches (they stay whatever later processing finds) or reject them (what the rule applied is taken back and never applied again).",
        "operationId": "decideClassificationRuleMatches",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClassificationDecisionDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassificationDecisionResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Review classification rule matches",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.update"
      }
    },
    "/classification/rules/{id}/matches": {
      "get": {
        "description": "The rule’s matches with one decision, suggestions to review by default.",
        "operationId": "getClassificationRuleMatches",
        "parameters": [
          {
            "name": "decision",
            "required": false,
            "in": "query",
            "schema": {
              "default": "suggested",
              "$ref": "#/components/schemas/ClassificationMatchDecision"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "page",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 9007199254740991,
              "default": 1,
              "type": "integer"
            }
          },
          {
            "name": "size",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 500,
              "default": 100,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassificationMatchPageDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List classification rule matches",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.read"
      }
    },
    "/classification/rules/{id}/plan": {
      "post": {
        "description": "What applying the rule now would add, suggest and take back, without writing anything. Manual decisions are never part of it.",
        "operationId": "planClassificationRule",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassificationPlanResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Plan a classification rule re-evaluation",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.read"
      }
    },
    "/classification/settings": {
      "get": {
        "description": "Whether rules may use visual categories, whether those can be compared now, and the default action.",
        "operationId": "getClassificationSettings",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassificationSettingsDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve classification rule settings",
        "tags": [
          "Albums"
        ],
        "x-frameleaf-permission": "album.read"
      }
    },
    "/cluster-groups/requests": {
      "get": {
        "description": "Retrieve the pending requests for the current user to join a cluster group.",
        "operationId": "getClusterGroupRequests",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/ClusterGroupRequestResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve cluster group requests",
        "tags": [
          "Cluster groups"
        ],
        "x-frameleaf-permission": "clusterGroupRequest.read"
      }
    },
    "/cluster-groups/requests/{id}": {
      "delete": {
        "description": "Delete a pending request to join a cluster group.",
        "operationId": "deleteClusterGroupRequest",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Decline a cluster group request",
        "tags": [
          "Cluster groups"
        ],
        "x-frameleaf-permission": "clusterGroupRequest.delete"
      }
    },
    "/cluster-groups/requests/{id}/accept": {
      "post": {
        "description": "Join the cluster group the request was created for.",
        "operationId": "acceptClusterGroupRequest",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Accept a cluster group request",
        "tags": [
          "Cluster groups"
        ],
        "x-frameleaf-permission": "clusterGroupRequest.create"
      }
    },
    "/cluster-groups/{id}/leave": {
      "post": {
        "description": "Move the current user into a new cluster group of their own.",
        "operationId": "leaveClusterGroup",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Leave a cluster group",
        "tags": [
          "Cluster groups"
        ],
        "x-frameleaf-permission": "clusterGroup.leave"
      }
    },
    "/cluster-groups/{id}/regenerate-people": {
      "post": {
        "description": "Forcefully re-run facial recognition for all faces of users in this group.",
        "operationId": "clusterGroupRegeneratePeople",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Regenerate people of users in cluster group",
        "tags": [
          "Cluster groups"
        ],
        "x-frameleaf-permission": "clusterGroup.read"
      }
    },
    "/cluster-groups/{id}/requests": {
      "get": {
        "description": "Retrieve the pending requests for other users to join the cluster group.",
        "operationId": "getClusterGroupRequestsForGroup",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/ClusterGroupRequestResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve the requests sent by a cluster group",
        "tags": [
          "Cluster groups"
        ],
        "x-frameleaf-permission": "clusterGroupRequest.read"
      },
      "put": {
        "description": "Ask another user to join the cluster group of the current user.",
        "operationId": "createClusterGroupRequest",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClusterGroupRequestCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClusterGroupRequestResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a cluster group request",
        "tags": [
          "Cluster groups"
        ],
        "x-frameleaf-permission": "clusterGroupRequest.create"
      }
    },
    "/cluster-groups/{id}/users": {
      "get": {
        "description": "Retrieve the users that are a member of the cluster group.",
        "operationId": "getClusterGroupUsers",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/UserResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve the users of a cluster group",
        "tags": [
          "Cluster groups"
        ],
        "x-frameleaf-permission": "clusterGroup.read"
      }
    },
    "/develop-presets": {
      "get": {
        "description": "Your saved develop presets, by name.",
        "operationId": "getDevelopPresets",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/DevelopPresetResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List develop presets",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "all"
      },
      "post": {
        "description": "Saves develop settings (sliders, look, strength and masks, never geometry) under a new name.",
        "operationId": "createDevelopPreset",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DevelopPresetCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DevelopPresetResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Save a develop preset",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/develop-presets/{id}": {
      "delete": {
        "description": "Deletes the preset. Versions already saved with its settings are unchanged.",
        "operationId": "deleteDevelopPreset",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a develop preset",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "all"
      },
      "put": {
        "description": "Renames a preset, changes its settings, or both. Settings the request leaves out keep their stored values.",
        "operationId": "updateDevelopPreset",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DevelopPresetUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DevelopPresetResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update a develop preset",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/documents": {
      "get": {
        "description": "List the signed-in account’s photos that show recognized text, newest first, optionally matching text read from them or the owner’s corrections.",
        "operationId": "searchDocuments",
        "parameters": [
          {
            "name": "page",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 9007199254740991,
              "default": 1,
              "type": "integer"
            }
          },
          {
            "name": "query",
            "required": false,
            "in": "query",
            "description": "Text to find in recognized text and in the owner’s corrections",
            "schema": {
              "maxLength": 200,
              "type": "string"
            }
          },
          {
            "name": "size",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 250,
              "default": 100,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentSearchResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Search documents",
        "tags": [
          "Documents"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/documents/{id}": {
      "get": {
        "description": "Retrieve the text read from a photo with the owner’s corrections applied, where each line is in the photo, and, for the owner, the values suggested from it.",
        "operationId": "getDocument",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve a document",
        "tags": [
          "Documents"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/documents/{id}/fields/{field}": {
      "delete": {
        "description": "Remove the owner’s decision about a field, so the text’s suggestion shows again.",
        "operationId": "deleteDocumentField",
        "parameters": [
          {
            "name": "field",
            "required": true,
            "in": "path",
            "schema": {
              "$ref": "#/components/schemas/DocumentField"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "revision",
            "required": true,
            "in": "query",
            "description": "Revision of the decision being removed",
            "schema": {
              "minimum": 1,
              "maximum": 9007199254740991,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Clear a document field decision",
        "tags": [
          "Documents"
        ],
        "x-frameleaf-permission": "asset.update"
      },
      "put": {
        "description": "Confirm, correct or dismiss a value suggested from the text of a photo.",
        "operationId": "updateDocumentField",
        "parameters": [
          {
            "name": "field",
            "required": true,
            "in": "path",
            "schema": {
              "$ref": "#/components/schemas/DocumentField"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DocumentFieldEditDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Decide a document field",
        "tags": [
          "Documents"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/documents/{id}/lines": {
      "put": {
        "description": "Record the owner’s correction or dismissal of one recognized line. The recognized text itself is kept unchanged.",
        "operationId": "updateDocumentLine",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DocumentLineEditDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Correct or dismiss a line of text",
        "tags": [
          "Documents"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/documents/{id}/lines/{editId}": {
      "delete": {
        "description": "Remove the owner’s correction or dismissal of a line, so it reads as recognized again.",
        "operationId": "deleteDocumentLine",
        "parameters": [
          {
            "name": "editId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "revision",
            "required": true,
            "in": "query",
            "description": "Revision of the decision being removed",
            "schema": {
              "minimum": 1,
              "maximum": 9007199254740991,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Restore a line of text",
        "tags": [
          "Documents"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/download/archive": {
      "post": {
        "description": "Download a ZIP archive containing the specified assets. The assets must have been previously requested via the \"getDownloadInfo\" endpoint.",
        "operationId": "downloadArchive",
        "parameters": [
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DownloadArchiveDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Download asset archive",
        "tags": [
          "Download"
        ],
        "x-frameleaf-permission": "asset.download"
      }
    },
    "/download/info": {
      "post": {
        "description": "Retrieve information about how to request a download for the specified assets or album. The response includes groups of assets that can be downloaded together.",
        "operationId": "getDownloadInfo",
        "parameters": [
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DownloadInfoDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DownloadResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve download information",
        "tags": [
          "Download"
        ],
        "x-frameleaf-permission": "asset.download"
      }
    },
    "/duplicates": {
      "delete": {
        "description": "Delete multiple duplicate assets specified by their IDs.",
        "operationId": "deleteDuplicates",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkIdsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete duplicates",
        "tags": [
          "Duplicates"
        ],
        "x-frameleaf-permission": "duplicate.delete"
      },
      "get": {
        "description": "Retrieve a list of duplicate assets available to the authenticated user.",
        "operationId": "getAssetDuplicates",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/DuplicateResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve duplicates",
        "tags": [
          "Duplicates"
        ],
        "x-frameleaf-permission": "duplicate.read"
      }
    },
    "/duplicates/decisions": {
      "get": {
        "description": "Your most recent duplicate decision jobs, which can be undone while nothing has changed since, and the decision jobs still running.",
        "operationId": "getDuplicateDecisions",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DuplicateDecisionHistoryDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve recent duplicate decisions",
        "tags": [
          "Duplicates"
        ],
        "x-frameleaf-permission": "duplicate.read"
      }
    },
    "/duplicates/resolve": {
      "post": {
        "description": "Resolve duplicate groups by synchronizing metadata across assets and deleting/trashing duplicates.",
        "operationId": "resolveDuplicates",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DuplicateResolveDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/BulkIdResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Resolve duplicate groups",
        "tags": [
          "Duplicates"
        ],
        "x-frameleaf-permission": "duplicate.delete"
      }
    },
    "/duplicates/review": {
      "get": {
        "description": "Your duplicate groups, each read as a whole: whether it holds copies of one photo or frames of a burst, the evidence behind the suggested keeper, and whether this session may decide it. A group with photos this session does not see, or with another account’s photo, is listed but cannot be decided.",
        "operationId": "getDuplicateReview",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/DuplicateReviewGroupDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve the duplicate review",
        "tags": [
          "Duplicates"
        ],
        "x-frameleaf-permission": "duplicate.read"
      }
    },
    "/duplicates/{id}": {
      "delete": {
        "description": "Dismiss a duplicate group by its ID, unlinking all assets in the group without deleting them.",
        "operationId": "deleteDuplicate",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Dismiss a duplicate group",
        "tags": [
          "Duplicates"
        ],
        "x-frameleaf-permission": "duplicate.delete"
      }
    },
    "/enrichment/frames/{id}": {
      "get": {
        "description": "The image of one reusable video frame, under the same access as its video.",
        "operationId": "getVideoMomentFrame",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get a video moment frame",
        "tags": [
          "Enrichment"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/enrichment/frames/{id}/similar": {
      "get": {
        "description": "Finds the moments nearest one frame's stored search embedding across your videos, including other times in the same video, never the frame itself. Nothing is sent to a model and nothing is written.",
        "operationId": "searchSimilarVideoMoments",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Most moments to return",
            "schema": {
              "minimum": 1,
              "maximum": 100,
              "default": 24,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VideoMomentSearchResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Find moments like a video frame",
        "tags": [
          "Enrichment"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/enrichment/moments/search": {
      "post": {
        "description": "Finds timestamped moments inside your videos by meaning, against the frame index, and by words in captions and typed transcripts.",
        "operationId": "searchVideoMoments",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VideoMomentSearchDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VideoMomentSearchResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Search video moments",
        "tags": [
          "Enrichment"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/enrichment/videos/{id}/cover": {
      "put": {
        "description": "Keeps the chosen frame as a time in the video, so it survives the frames being cut again. Null returns to the best-ranked frame.",
        "operationId": "setVideoMomentCover",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VideoMomentCoverDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VideoMomentsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Choose a video cover frame",
        "tags": [
          "Enrichment"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/enrichment/videos/{id}/moments": {
      "get": {
        "description": "The reusable frames of a video ranked best first, its cover, its generated and manual moments, and what they were made from, with any that are out of date marked.",
        "operationId": "getVideoMoments",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VideoMomentsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get video moments",
        "tags": [
          "Enrichment"
        ],
        "x-frameleaf-permission": "asset.read"
      },
      "post": {
        "description": "Adds your own moment, with an optional title and typed transcript. Refreshing never removes it.",
        "operationId": "createVideoMoment",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VideoMomentCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VideoMomentDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Add a video moment",
        "tags": [
          "Enrichment"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/enrichment/videos/{id}/moments/{momentId}": {
      "delete": {
        "description": "Removes one of your own moments. Generated moments are refreshed, not deleted.",
        "operationId": "deleteVideoMoment",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Asset ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "momentId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a video moment",
        "tags": [
          "Enrichment"
        ],
        "x-frameleaf-permission": "asset.update"
      },
      "put": {
        "description": "Edits one of your own moments. Generated moments are refreshed, not edited.",
        "operationId": "updateVideoMoment",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Asset ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "momentId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VideoMomentUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VideoMomentDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update a video moment",
        "tags": [
          "Enrichment"
        ],
        "x-frameleaf-permission": "asset.update"
      }
    },
    "/faces": {
      "get": {
        "description": "Retrieve all faces belonging to an asset.",
        "operationId": "getFaces",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "query",
            "description": "Face ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "withHidden",
            "required": false,
            "in": "query",
            "description": "Also list faces the asset's owner hid (owner only)",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AssetFaceResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve faces for asset",
        "tags": [
          "Faces"
        ],
        "x-frameleaf-permission": "face.read"
      },
      "post": {
        "description": "Create a new face that has not been discovered by facial recognition. The content of the bounding box is considered a face.",
        "operationId": "createFace",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetFaceCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetFaceResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a face",
        "tags": [
          "Faces"
        ],
        "x-frameleaf-permission": "face.create"
      }
    },
    "/faces/source": {
      "get": {
        "description": "Retrieve the revision of the image faces are drawn on. Send it back as expectedSourceRevision when creating or moving a face; it changes when the image, its orientation or its edits change.",
        "operationId": "getFaceSource",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "query",
            "description": "Face ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetFaceSourceResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve the face source revision for an asset",
        "tags": [
          "Faces"
        ],
        "x-frameleaf-permission": "face.read"
      }
    },
    "/faces/{id}": {
      "delete": {
        "description": "Delete a face identified by the id. Optionally can be force deleted.",
        "operationId": "deleteFace",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetFaceDeleteDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a face",
        "tags": [
          "Faces"
        ],
        "x-frameleaf-permission": "face.delete"
      },
      "patch": {
        "description": "Reassign or unassign a face, move or resize it, or hide it and show it again. The correction is refused with 409 when the face (or, for a box, the image) changed since expectedRevision.",
        "operationId": "correctFace",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetFaceCorrectionDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetFaceResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Correct a face",
        "tags": [
          "Faces"
        ],
        "x-frameleaf-permission": "face.update"
      },
      "put": {
        "description": "Re-assign the face provided in the body to the person identified by the id in the path parameter.",
        "operationId": "reassignFacesById",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FaceDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PersonResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Re-assign a face to another person",
        "tags": [
          "Faces"
        ],
        "x-frameleaf-permission": "face.update"
      }
    },
    "/item-shares": {
      "delete": {
        "description": "Stop sharing your own items with these people. They lose access at once.",
        "operationId": "unshareItems",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ItemShareChangeDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ItemShareChangeResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Stop sharing items with people",
        "tags": [
          "Item shares"
        ],
        "x-frameleaf-permission": "asset.share"
      },
      "post": {
        "description": "Share your own items with people who have an account on this server. They see the items under Sharing, in their own library, and are notified. Locked items are refused.",
        "operationId": "shareItems",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ItemShareChangeDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ItemShareChangeResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Share items with people",
        "tags": [
          "Item shares"
        ],
        "x-frameleaf-permission": "asset.share"
      }
    },
    "/item-shares/query": {
      "put": {
        "description": "The people each of your own items is shared with.",
        "operationId": "getItemShares",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ItemShareQueryDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/ItemShareResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List who items are shared with",
        "tags": [
          "Item shares"
        ],
        "x-frameleaf-permission": "asset.share"
      }
    },
    "/item-shares/received": {
      "get": {
        "description": "Items other people shared with you one by one, newest first. Items that are locked, trashed or no longer shared are left out.",
        "operationId": "getReceivedItemShares",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ItemShareReceivedResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Items shared with you",
        "tags": [
          "Item shares"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/jobs": {
      "get": {
        "deprecated": true,
        "description": "Retrieve the counts of the current queue, as well as the current status.",
        "operationId": "getQueuesLegacy",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QueuesResponseLegacyDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve queue counts and status",
        "tags": [
          "Jobs",
          "Deprecated"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "job.read"
      },
      "post": {
        "description": "Run a specific job. Most jobs are queued automatically, but this endpoint allows for manual creation of a handful of jobs, including various cleanup tasks, as well as creating a new database backup.",
        "operationId": "createJob",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JobCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a manual job",
        "tags": [
          "Jobs"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "job.create"
      }
    },
    "/jobs/runs": {
      "get": {
        "operationId": "getJobRuns",
        "parameters": [
          {
            "name": "skip",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 0,
              "maximum": 9007199254740991,
              "default": 0,
              "type": "integer"
            }
          },
          {
            "name": "take",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 100,
              "default": 25,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobRunPageDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List durable job runs",
        "tags": [
          "Jobs"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "job.read"
      }
    },
    "/jobs/runs/{id}/items": {
      "get": {
        "operationId": "getJobRunItems",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          },
          {
            "name": "skip",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 0,
              "maximum": 9007199254740991,
              "default": 0,
              "type": "integer"
            }
          },
          {
            "name": "take",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 100,
              "default": 25,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobRunItemPageDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Inspect selected job run items",
        "tags": [
          "Jobs"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "job.read"
      }
    },
    "/jobs/{name}": {
      "put": {
        "deprecated": true,
        "description": "Queue all assets for a specific job type. Defaults to only queueing assets that have not yet been processed, but the force command can be used to re-process all assets.",
        "operationId": "runQueueCommandLegacy",
        "parameters": [
          {
            "name": "name",
            "required": true,
            "in": "path",
            "schema": {
              "$ref": "#/components/schemas/QueueName"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QueueCommandDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QueueResponseLegacyDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Run jobs",
        "tags": [
          "Jobs",
          "Deprecated"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "job.create"
      }
    },
    "/libraries": {
      "get": {
        "description": "Retrieve a list of external libraries, each with its latest scan.",
        "operationId": "getAllLibraries",
        "parameters": [
          {
            "name": "withDeleted",
            "required": false,
            "in": "query",
            "description": "Include libraries whose removal is still in progress",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/LibraryResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve libraries",
        "tags": [
          "Libraries"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "library.read"
      },
      "post": {
        "description": "Create a new external library.",
        "operationId": "createLibrary",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateLibraryDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LibraryResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a library",
        "tags": [
          "Libraries"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "library.create"
      }
    },
    "/libraries/managed-uploads": {
      "get": {
        "description": "Retrieve, for every active account, the photos, videos and original sizes it keeps in managed upload storage rather than in external libraries.",
        "operationId": "getManagedUploadStatistics",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/ManagedUploadsStatsResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve managed upload statistics",
        "tags": [
          "Libraries"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "library.statistics"
      }
    },
    "/libraries/{id}": {
      "delete": {
        "description": "Delete an external library by its ID.",
        "operationId": "deleteLibrary",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a library",
        "tags": [
          "Libraries"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "library.delete"
      },
      "get": {
        "description": "Retrieve an external library by its ID.",
        "operationId": "getLibrary",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LibraryResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve a library",
        "tags": [
          "Libraries"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "library.read"
      },
      "put": {
        "deprecated": true,
        "description": "Update an existing external library.",
        "operationId": "updateLibrary",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLibraryDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LibraryResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update a library",
        "tags": [
          "Libraries",
          "Deprecated"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "library.update"
      }
    },
    "/libraries/{id}/removal": {
      "get": {
        "description": "The first stage of removing an external library: the indexed items, albums, shared links and faces the removal takes with it, and a token to confirm it with. Source files are never deleted.",
        "operationId": "getLibraryRemovalReview",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LibraryRemovalReviewDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Review a library removal",
        "tags": [
          "Libraries"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "library.delete"
      },
      "post": {
        "description": "The second stage of removing an external library: confirm with the typed name and the review token. Refused when the library changed after the review.",
        "operationId": "removeLibrary",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LibraryRemovalDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Remove a library",
        "tags": [
          "Libraries"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "library.delete"
      }
    },
    "/libraries/{id}/scan": {
      "delete": {
        "description": "Stop the external library's waiting, running or paused scan. Items it already handled stay as they are.",
        "operationId": "cancelLibraryScan",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Cancel a library scan",
        "tags": [
          "Libraries"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "library.update"
      },
      "post": {
        "description": "Queue a scan for the external library to find and import new assets.",
        "operationId": "scanLibrary",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Scan a library",
        "tags": [
          "Libraries"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "library.update"
      }
    },
    "/libraries/{id}/statistics": {
      "get": {
        "description": "Retrieve statistics for a specific external library, including number of videos, images, and storage usage.",
        "operationId": "getLibraryStatistics",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LibraryStatsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve library statistics",
        "tags": [
          "Libraries"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "library.statistics"
      }
    },
    "/libraries/{id}/validate": {
      "post": {
        "description": "Validate the settings of an external library.",
        "operationId": "validate",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ValidateLibraryDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidateLibraryResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Validate library settings",
        "tags": [
          "Libraries"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "all"
      }
    },
    "/live-photo/candidates": {
      "get": {
        "description": "Find separated live photos (a still image and its motion video that are not linked) that can be reassembled.",
        "operationId": "getLivePhotoCandidates",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LivePhotoCandidatesResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List live photo relink candidates",
        "tags": [
          "Live Photo"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/live-photo/relink": {
      "post": {
        "description": "Reassemble the selected still + video pairs into live photos, hiding the standalone videos.",
        "operationId": "relinkLivePhotos",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LivePhotoRelinkDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LivePhotoRelinkResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Relink live photos",
        "tags": [
          "Live Photo"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/map/markers": {
      "get": {
        "description": "Retrieve a list of latitude and longitude coordinates for every asset with location data.",
        "operationId": "getMapMarkers",
        "parameters": [
          {
            "name": "fileCreatedAfter",
            "required": false,
            "in": "query",
            "description": "Filter assets created after this date",
            "schema": {
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
              "example": "2024-01-01T00:00:00.000Z",
              "type": "string"
            }
          },
          {
            "name": "fileCreatedBefore",
            "required": false,
            "in": "query",
            "description": "Filter assets created before this date",
            "schema": {
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
              "example": "2024-01-01T00:00:00.000Z",
              "type": "string"
            }
          },
          {
            "name": "isArchived",
            "required": false,
            "in": "query",
            "description": "Filter by archived status",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isFavorite",
            "required": false,
            "in": "query",
            "description": "Filter by favorite status",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "withSharedAlbums",
            "required": false,
            "in": "query",
            "description": "Include shared album assets",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/MapMarkerResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve map markers",
        "tags": [
          "Map"
        ],
        "x-frameleaf-permission": "map.read"
      }
    },
    "/map/reverse-geocode": {
      "get": {
        "description": "Retrieve location information (e.g., city, country) for given latitude and longitude coordinates.",
        "operationId": "reverseGeocode",
        "parameters": [
          {
            "name": "lat",
            "required": true,
            "in": "query",
            "description": "Latitude (-90 to 90)",
            "schema": {
              "format": "double",
              "type": "number"
            }
          },
          {
            "name": "lon",
            "required": true,
            "in": "query",
            "description": "Longitude (-180 to 180)",
            "schema": {
              "format": "double",
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/MapReverseGeocodeResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Reverse geocode coordinates",
        "tags": [
          "Map"
        ],
        "x-frameleaf-permission": "map.search"
      }
    },
    "/map/statistics": {
      "get": {
        "description": "Count what the map settings would add: the viewer's own located archived items and the located items of partners who share their locations, under the same date and favorite filters, and the viewer's own items without a location.",
        "operationId": "getMapStatistics",
        "parameters": [
          {
            "name": "fileCreatedAfter",
            "required": false,
            "in": "query",
            "description": "Filter assets created after this date",
            "schema": {
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
              "example": "2024-01-01T00:00:00.000Z",
              "type": "string"
            }
          },
          {
            "name": "fileCreatedBefore",
            "required": false,
            "in": "query",
            "description": "Filter assets created before this date",
            "schema": {
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
              "example": "2024-01-01T00:00:00.000Z",
              "type": "string"
            }
          },
          {
            "name": "isArchived",
            "required": false,
            "in": "query",
            "description": "Filter by archived status",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isFavorite",
            "required": false,
            "in": "query",
            "description": "Filter by favorite status",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "withSharedAlbums",
            "required": false,
            "in": "query",
            "description": "Include shared album assets",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MapStatisticsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve map statistics",
        "tags": [
          "Map"
        ],
        "x-frameleaf-permission": "map.read"
      }
    },
    "/media-health": {
      "get": {
        "description": "List missing and corrupt media health findings in timeline buckets.",
        "operationId": "list",
        "parameters": [
          {
            "name": "allAccounts",
            "required": false,
            "in": "query",
            "description": "Review every account; administrators only",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "category",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/MediaHealthCategory"
            }
          },
          {
            "name": "needsAttention",
            "required": false,
            "in": "query",
            "description": "Only findings that still need a decision",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "ownerId",
            "required": false,
            "in": "query",
            "description": "Account to review; administrators only for another account",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "page",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 9007199254740991,
              "default": 1,
              "type": "integer"
            }
          },
          {
            "name": "size",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 200,
              "default": 100,
              "type": "integer"
            }
          },
          {
            "name": "status",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/MediaHealthStatus"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MediaHealthListResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List media health findings",
        "tags": [
          "Media Health"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/media-health/candidates/choose": {
      "post": {
        "description": "Record which verified exact copy each missing original should be relinked to.",
        "operationId": "chooseCandidates",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MediaHealthChooseCandidatesDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MediaHealthBulkResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Choose media health candidates",
        "tags": [
          "Media Health"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/media-health/corrupt": {
      "delete": {
        "description": "Move recently confirmed corrupt media findings to trash after revalidation.",
        "operationId": "deleteCorrupt",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MediaHealthDeleteCorruptDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MediaHealthBulkResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Move confirmed corrupt media to trash",
        "tags": [
          "Media Health"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/media-health/corrupt/recover": {
      "post": {
        "description": "Queue a durable job replacing confirmed damage with an exact, decoded copy while keeping the damaged file.",
        "operationId": "recoverDamaged",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MediaHealthRecoverDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MediaHealthBulkResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Recover damaged media from a verified copy",
        "tags": [
          "Media Health"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/media-health/corrupt/scan": {
      "post": {
        "description": "Queue an explicit scan that validates source media integrity.",
        "operationId": "startCorruptScan",
        "parameters": [],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MediaHealthScanResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Start corrupt media scan",
        "tags": [
          "Media Health"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/media-health/dismiss": {
      "post": {
        "description": "Dismiss selected media health findings without modifying assets.",
        "operationId": "dismiss",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MediaHealthBulkActionDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Dismiss media health findings",
        "tags": [
          "Media Health"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/media-health/missing/locate": {
      "post": {
        "description": "Queue a durable exact-checksum search of the chosen locations for missing originals or copies of confirmed damage.",
        "operationId": "locateMissing",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MediaHealthLocateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MediaHealthScanResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Locate missing media",
        "tags": [
          "Media Health"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/media-health/missing/relink": {
      "post": {
        "description": "Queue a durable job relinking missing originals to their verified exact copies.",
        "operationId": "relinkMissing",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MediaHealthBulkActionDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MediaHealthBulkResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Relink missing media",
        "tags": [
          "Media Health"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/media-health/missing/scan": {
      "post": {
        "description": "Queue an owner-scoped scan that identifies missing files and restores supported untracked media.",
        "operationId": "startMissingScan",
        "parameters": [],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MediaHealthScanResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Start missing media scan",
        "tags": [
          "Media Health"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/media-health/reopen": {
      "post": {
        "description": "Undo a dismissal, or reopen confirmed damage whose item was restored from the trash, putting the findings back in review.",
        "operationId": "reopen",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MediaHealthBulkActionDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MediaHealthBulkResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Reopen media health findings",
        "tags": [
          "Media Health"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/media-health/roots": {
      "get": {
        "description": "Locations the caller may search for exact copies of missing or damaged originals.",
        "operationId": "getRoots",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MediaHealthRootsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List Library Care search locations",
        "tags": [
          "Media Health"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/media-health/summary": {
      "get": {
        "description": "Queue sizes for missing, damaged, duplicate, import and enrichment work, the latest scan or search, and recent Library Care jobs.",
        "operationId": "getSummary",
        "parameters": [
          {
            "name": "allAccounts",
            "required": false,
            "in": "query",
            "description": "Review every account; administrators only",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "ownerId",
            "required": false,
            "in": "query",
            "description": "Account to review; administrators only for another account",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MediaHealthSummaryResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get Library Care summary",
        "tags": [
          "Media Health"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/media-operations/{id}": {
      "delete": {
        "description": "Removes a finished job from your Activity list. The record is kept for lineage and remote cleanup.",
        "operationId": "dismissMediaOperation",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Clear a finished media operation",
        "tags": [
          "Media operations"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/media-operations/{id}/reverse-preview": {
      "get": {
        "description": "The checked H264/AAC derivative of your completed source reversal. Every read verifies current project and source access and the checksum of the returned bytes.",
        "operationId": "viewMediaOperationReversePreview",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "View a source reversal preview",
        "tags": [
          "Media operations"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/media-operations/{id}/reverse-result": {
      "get": {
        "description": "Owner-only metadata after current project, source and generated-lineage authorization. Contains no storage paths or worker grants.",
        "operationId": "getMediaOperationReverseResult",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioReverseConformResultDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get a completed source reversal result",
        "tags": [
          "Media operations"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/memories": {
      "get": {
        "description": "Retrieve a list of memories. Memories are sorted descending by creation date by default, although they can also be sorted in ascending order, or randomly.",
        "operationId": "searchMemories",
        "parameters": [
          {
            "name": "for",
            "required": false,
            "in": "query",
            "description": "Filter by date",
            "schema": {
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
              "example": "2024-01-01",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": false,
            "in": "query",
            "description": "Memory ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "isHidden",
            "required": false,
            "in": "query",
            "description": "Only the memories the owner hid (true); hidden memories are left out otherwise",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isSaved",
            "required": false,
            "in": "query",
            "description": "Filter by saved status",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isTrashed",
            "required": false,
            "in": "query",
            "description": "Include trashed memories",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isUpcoming",
            "required": false,
            "in": "query",
            "description": "Filter by memories that have not been shown yet",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "order",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/MemorySearchOrder"
            }
          },
          {
            "name": "page",
            "required": false,
            "in": "query",
            "description": "Page number",
            "schema": {
              "minimum": 1,
              "maximum": 9007199254740991,
              "type": "integer"
            }
          },
          {
            "name": "size",
            "required": false,
            "in": "query",
            "description": "Number of memories to return",
            "schema": {
              "minimum": 1,
              "maximum": 9007199254740991,
              "type": "integer"
            }
          },
          {
            "name": "type",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/MemoryType"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/MemoryResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve memories",
        "tags": [
          "Memories"
        ],
        "x-frameleaf-permission": "memory.read"
      },
      "post": {
        "description": "Create a new memory by providing a name, description, and a list of asset IDs to include in the memory.",
        "operationId": "createMemory",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MemoryCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemoryResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a memory",
        "tags": [
          "Memories"
        ],
        "x-frameleaf-permission": "memory.create"
      }
    },
    "/memories/exports": {
      "get": {
        "description": "Retrieve the caller's own private highlight exports, newest first, optionally limited to a single memory. This is the durable job state the Activity page reads.",
        "operationId": "getMemoryExports",
        "parameters": [
          {
            "name": "memoryId",
            "required": false,
            "in": "query",
            "description": "Only return exports of this memory",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/MemoryExportResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve memory exports",
        "tags": [
          "Memories"
        ],
        "x-frameleaf-permission": "memory.read"
      }
    },
    "/memories/exports/{id}": {
      "delete": {
        "description": "Cancel the export if it is still running, then delete the run and its archive.",
        "operationId": "deleteMemoryExport",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a memory export",
        "tags": [
          "Memories"
        ],
        "x-frameleaf-permission": "memory.delete"
      },
      "get": {
        "description": "Retrieve the current state of one of the caller's own private highlight exports.",
        "operationId": "getMemoryExport",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemoryExportResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve a memory export",
        "tags": [
          "Memories"
        ],
        "x-frameleaf-permission": "memory.read"
      }
    },
    "/memories/exports/{id}/cancel": {
      "post": {
        "description": "Ask for a running export to stop. A queued export is cancelled immediately; a running one stops at its next asset. Cancelling a finished export returns its final state unchanged.",
        "operationId": "cancelMemoryExport",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemoryExportResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Cancel a memory export",
        "tags": [
          "Memories"
        ],
        "x-frameleaf-permission": "memory.update"
      }
    },
    "/memories/exports/{id}/download": {
      "get": {
        "description": "Download the finished archive for one of the caller's own exports. The archive is not reachable by any other route and is deleted when it expires.",
        "operationId": "downloadMemoryExport",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Download a memory export",
        "tags": [
          "Memories"
        ],
        "x-frameleaf-permission": "memory.read"
      }
    },
    "/memories/exports/{id}/library": {
      "post": {
        "description": "Save a finished highlight video of one of the caller's own memories to their library. Until then it is kept with the memory, out of the library, and removed with it.",
        "operationId": "saveMemoryExportToLibrary",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemoryExportResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Save a memory highlight to the library",
        "tags": [
          "Memories"
        ],
        "x-frameleaf-permission": "memory.update"
      }
    },
    "/memories/show-less": {
      "delete": {
        "description": "Remove one of the caller's show-less rules, so its memories are generated and shown again, and return every rule.",
        "operationId": "removeMemoryShowLess",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MemoryShowLessDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/MemoryShowLessResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Remove a memories show-less rule",
        "tags": [
          "Memories"
        ],
        "x-frameleaf-permission": "memory.update"
      },
      "get": {
        "description": "Retrieve the caller's own rules: people, pets, dates and kinds of memory they asked to see less of. Memories of them are neither generated nor shown.",
        "operationId": "getMemoryShowLess",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/MemoryShowLessResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve memories show-less rules",
        "tags": [
          "Memories"
        ],
        "x-frameleaf-permission": "memory.read"
      },
      "post": {
        "description": "Add a show-less rule for one of the caller's own people or pets, a date written as 'MM-dd', or a memory type, and return every rule.",
        "operationId": "addMemoryShowLess",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MemoryShowLessDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/MemoryShowLessResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Show less of a person, pet, date or kind of memory",
        "tags": [
          "Memories"
        ],
        "x-frameleaf-permission": "memory.update"
      }
    },
    "/memories/statistics": {
      "get": {
        "description": "Retrieve statistics about memories, such as total count and other relevant metrics.",
        "operationId": "memoriesStatistics",
        "parameters": [
          {
            "name": "for",
            "required": false,
            "in": "query",
            "description": "Filter by date",
            "schema": {
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
              "example": "2024-01-01",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": false,
            "in": "query",
            "description": "Memory ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "isHidden",
            "required": false,
            "in": "query",
            "description": "Only the memories the owner hid (true); hidden memories are left out otherwise",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isSaved",
            "required": false,
            "in": "query",
            "description": "Filter by saved status",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isTrashed",
            "required": false,
            "in": "query",
            "description": "Include trashed memories",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isUpcoming",
            "required": false,
            "in": "query",
            "description": "Filter by memories that have not been shown yet",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "order",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/MemorySearchOrder"
            }
          },
          {
            "name": "page",
            "required": false,
            "in": "query",
            "description": "Page number",
            "schema": {
              "minimum": 1,
              "maximum": 9007199254740991,
              "type": "integer"
            }
          },
          {
            "name": "size",
            "required": false,
            "in": "query",
            "description": "Number of memories to return",
            "schema": {
              "minimum": 1,
              "maximum": 9007199254740991,
              "type": "integer"
            }
          },
          {
            "name": "type",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/MemoryType"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemoryStatisticsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve memories statistics",
        "tags": [
          "Memories"
        ],
        "x-frameleaf-permission": "memory.statistics"
      }
    },
    "/memories/{id}": {
      "delete": {
        "description": "Delete a specific memory by its ID.",
        "operationId": "deleteMemory",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a memory",
        "tags": [
          "Memories"
        ],
        "x-frameleaf-permission": "memory.delete"
      },
      "get": {
        "description": "Retrieve a specific memory by its ID.",
        "operationId": "getMemory",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemoryResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve a memory",
        "tags": [
          "Memories"
        ],
        "x-frameleaf-permission": "memory.read"
      },
      "put": {
        "deprecated": true,
        "description": "Update an existing memory by its ID.",
        "operationId": "updateMemory",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MemoryUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemoryResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update a memory",
        "tags": [
          "Memories",
          "Deprecated"
        ],
        "x-frameleaf-permission": "memory.update"
      }
    },
    "/memories/{id}/assets": {
      "delete": {
        "description": "Remove a list of asset IDs from a specific memory.",
        "operationId": "removeMemoryAssets",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkIdsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/BulkIdResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Remove assets from a memory",
        "tags": [
          "Memories"
        ],
        "x-frameleaf-permission": "memoryAsset.delete"
      },
      "put": {
        "description": "Add a list of asset IDs to a specific memory.",
        "operationId": "addMemoryAssets",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkIdsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/BulkIdResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Add assets to a memory",
        "tags": [
          "Memories"
        ],
        "x-frameleaf-permission": "memoryAsset.create"
      }
    },
    "/memories/{id}/exports": {
      "post": {
        "description": "Start a private highlight export of a memory's assets as a durable, cancellable background job. The asset list is snapshotted when the export starts, and a second request while one is already running returns the export in flight.",
        "operationId": "createMemoryExport",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MemoryExportCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemoryExportResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Export a memory",
        "tags": [
          "Memories"
        ],
        "x-frameleaf-permission": "memory.update"
      }
    },
    "/notifications": {
      "delete": {
        "description": "Delete a list of notifications at once.",
        "operationId": "deleteNotifications",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NotificationDeleteAllDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete notifications",
        "tags": [
          "Notifications"
        ],
        "x-frameleaf-permission": "notification.delete"
      },
      "get": {
        "description": "Retrieve a list of notifications.",
        "operationId": "getNotifications",
        "parameters": [
          {
            "name": "id",
            "required": false,
            "in": "query",
            "description": "Filter by notification ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "level",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/NotificationLevel"
            }
          },
          {
            "name": "type",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/NotificationType"
            }
          },
          {
            "name": "unread",
            "required": false,
            "in": "query",
            "description": "Filter by unread status",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/NotificationDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve notifications",
        "tags": [
          "Notifications"
        ],
        "x-frameleaf-permission": "notification.read"
      },
      "put": {
        "description": "Update a list of notifications. Allows to bulk-set the read status of notifications.",
        "operationId": "updateNotifications",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NotificationUpdateAllDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update notifications",
        "tags": [
          "Notifications"
        ],
        "x-frameleaf-permission": "notification.update"
      }
    },
    "/notifications/{id}": {
      "delete": {
        "description": "Delete a specific notification.",
        "operationId": "deleteNotification",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a notification",
        "tags": [
          "Notifications"
        ],
        "x-frameleaf-permission": "notification.delete"
      },
      "get": {
        "description": "Retrieve a specific notification identified by id.",
        "operationId": "getNotification",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get a notification",
        "tags": [
          "Notifications"
        ],
        "x-frameleaf-permission": "notification.read"
      },
      "put": {
        "description": "Update a specific notification to set its read status.",
        "operationId": "updateNotification",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NotificationUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update a notification",
        "tags": [
          "Notifications"
        ],
        "x-frameleaf-permission": "notification.update"
      }
    },
    "/partners": {
      "get": {
        "description": "Retrieve a list of partners with whom assets are shared.",
        "operationId": "getPartners",
        "parameters": [
          {
            "name": "direction",
            "required": true,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/PartnerDirection"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/PartnerResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve partners",
        "tags": [
          "Partners"
        ],
        "x-frameleaf-permission": "partner.read"
      },
      "post": {
        "description": "Create a new partner to share assets with.",
        "operationId": "createPartner",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PartnerCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a partner",
        "tags": [
          "Partners"
        ],
        "x-frameleaf-permission": "partner.create"
      }
    },
    "/partners/locked-notice": {
      "get": {
        "description": "Whether to show the one-time notice that Locked items arrived from a partner and stay hidden until you set a PIN.",
        "operationId": "getPartnerLockedNotice",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerLockedNoticeResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get the Locked partner items notice",
        "tags": [
          "Partners"
        ],
        "x-frameleaf-permission": "partner.read"
      },
      "put": {
        "description": "Dismisses the one-time notice about Locked partner items for good. The items stay locked.",
        "operationId": "dismissPartnerLockedNotice",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerLockedNoticeResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Dismiss the Locked partner items notice",
        "tags": [
          "Partners"
        ],
        "x-frameleaf-permission": "partner.update"
      }
    },
    "/partners/{id}": {
      "delete": {
        "description": "Stop sharing assets with a partner.",
        "operationId": "removePartner",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Remove a partner",
        "tags": [
          "Partners"
        ],
        "x-frameleaf-permission": "partner.delete"
      },
      "post": {
        "deprecated": true,
        "description": "Create a new partner to share assets with.",
        "operationId": "createPartnerDeprecated",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a partner",
        "tags": [
          "Partners",
          "Deprecated"
        ],
        "x-frameleaf-permission": "partner.create"
      },
      "put": {
        "description": "A partnership has no settings left (): partners receive their own copies and locations are always shared. Kept for older clients; returns the partner who shares with the user.",
        "operationId": "updatePartner",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PartnerUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PartnerResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update a partner",
        "tags": [
          "Partners"
        ],
        "x-frameleaf-permission": "partner.update"
      }
    },
    "/people": {
      "delete": {
        "description": "Bulk delete a list of people at once.",
        "operationId": "deletePeople",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkIdsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete people",
        "tags": [
          "People"
        ],
        "x-frameleaf-permission": "person.delete"
      },
      "get": {
        "description": "Retrieve a list of all people.",
        "operationId": "getAllPeople",
        "parameters": [
          {
            "name": "closestAssetId",
            "required": false,
            "in": "query",
            "description": "Closest asset ID for similarity search",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "closestPersonId",
            "required": false,
            "in": "query",
            "description": "Closest person ID for similarity search",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "page",
            "required": false,
            "in": "query",
            "description": "Page number for pagination",
            "schema": {
              "minimum": 1,
              "maximum": 9007199254740991,
              "default": 1,
              "type": "integer"
            }
          },
          {
            "name": "size",
            "required": false,
            "in": "query",
            "description": "Number of items per page",
            "schema": {
              "minimum": 1,
              "maximum": 1000,
              "default": 500,
              "type": "integer"
            }
          },
          {
            "name": "withHidden",
            "required": false,
            "in": "query",
            "description": "Include hidden people",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PeopleResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get all people",
        "tags": [
          "People"
        ],
        "x-frameleaf-permission": "person.read"
      },
      "post": {
        "description": "Create a new person that can have multiple faces assigned to them.",
        "operationId": "createPerson",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PersonCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PersonResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a person",
        "tags": [
          "People"
        ],
        "x-frameleaf-permission": "person.create"
      },
      "put": {
        "description": "Bulk update multiple people at once.",
        "operationId": "updatePeople",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PeopleUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/BulkIdResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update people",
        "tags": [
          "People"
        ],
        "x-frameleaf-permission": "person.update"
      }
    },
    "/people/corrections/{id}/undo": {
      "post": {
        "description": "Reverse one manual face decision from the correction history, while the face still stands as the decision left it (same original, same place, same person). Otherwise 409 with a `reason`.",
        "operationId": "undoCorrection",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PersonCorrectionDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Undo a face correction",
        "tags": [
          "People"
        ],
        "x-frameleaf-permission": "person.update"
      }
    },
    "/people/merge": {
      "post": {
        "description": "Merge an ordered list of people together into a single person. The final name and birth date are always the first defined value, following the order. Also automatically merges people for other users in the cluster group, skipping people that would result in overriding a previously set name or birth date.",
        "operationId": "mergePeople",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MergePersonDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/BulkIdResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Merge people",
        "tags": [
          "People"
        ],
        "x-frameleaf-permission": "person.merge"
      }
    },
    "/people/merge-suggestions": {
      "get": {
        "description": "Retrieve suggested pairs of people that may be the same person, based on face similarity, for the guided merge review flow.",
        "operationId": "getMergeSuggestions",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MergeSuggestionsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get merge suggestions",
        "tags": [
          "People"
        ],
        "x-frameleaf-permission": "person.read"
      }
    },
    "/people/merge-suggestions/verdicts": {
      "delete": {
        "description": "Remove the recorded verdict for a pair of people, so the pair can be suggested again. The same person id twice undoes \"ignore\" for that person.",
        "operationId": "deleteMergeVerdict",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PersonMergeVerdictDeleteDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Undo a merge suggestion verdict",
        "tags": [
          "People"
        ],
        "x-frameleaf-permission": "person.update"
      },
      "put": {
        "description": "Answer a suggested pair of people: \"same\" merges them now, \"different\" never suggests the pair again, \"later\" skips it for 30 days and \"ignore\" stops suggesting `personId` with anyone. Replaces an earlier verdict for the same pair (a \"later\" never replaces a \"different\"); the pair may be given in either order.",
        "operationId": "setMergeVerdict",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PersonMergeVerdictCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PersonMergeVerdictResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Record a merge suggestion verdict",
        "tags": [
          "People"
        ],
        "x-frameleaf-permission": "person.update"
      }
    },
    "/people/{id}": {
      "delete": {
        "description": "Delete an individual person.",
        "operationId": "deletePerson",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete person",
        "tags": [
          "People"
        ],
        "x-frameleaf-permission": "person.delete"
      },
      "get": {
        "description": "Retrieve a person by id.",
        "operationId": "getPerson",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PersonResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get a person",
        "tags": [
          "People"
        ],
        "x-frameleaf-permission": "person.read"
      },
      "put": {
        "deprecated": true,
        "description": "Update an individual person.",
        "operationId": "updatePerson",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PersonUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PersonResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update person",
        "tags": [
          "People",
          "Deprecated"
        ],
        "x-frameleaf-permission": "person.update"
      }
    },
    "/people/{id}/corrections": {
      "get": {
        "description": "Retrieve the manual face decisions made about this person (faces moved onto or off them, \"not a face of anyone\", merges and moved face boxes), most recent first, a page at a time. Only the owner sees them. A photo that can no longer be shown (trashed, Locked, hidden) is left out of the evidence.",
        "operationId": "getCorrectionHistory",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "page",
            "required": false,
            "in": "query",
            "description": "Page number",
            "schema": {
              "minimum": 1,
              "maximum": 9007199254740991,
              "default": 1,
              "type": "integer"
            }
          },
          {
            "name": "size",
            "required": false,
            "in": "query",
            "description": "Number of decisions per page",
            "schema": {
              "minimum": 1,
              "maximum": 100,
              "default": 25,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PersonCorrectionsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get correction history",
        "tags": [
          "People"
        ],
        "x-frameleaf-permission": "person.read"
      }
    },
    "/people/{id}/merge": {
      "post": {
        "deprecated": true,
        "description": "Merge a list of people into the person specified in the path parameter.",
        "operationId": "mergePersonLegacy",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MergePersonDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/BulkIdResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Merge people",
        "tags": [
          "People",
          "Deprecated"
        ],
        "x-frameleaf-permission": "person.merge"
      }
    },
    "/people/{id}/reassign": {
      "put": {
        "description": "Bulk reassign a list of faces to a different person.",
        "operationId": "reassignFaces",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetFaceUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/PersonResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Reassign faces",
        "tags": [
          "People"
        ],
        "x-frameleaf-permission": "person.reassign"
      }
    },
    "/people/{id}/statistics": {
      "get": {
        "description": "Retrieve statistics about a specific person.",
        "operationId": "getPersonStatistics",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PersonStatisticsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get person statistics",
        "tags": [
          "People"
        ],
        "x-frameleaf-permission": "person.statistics"
      }
    },
    "/people/{id}/thumbnail": {
      "get": {
        "description": "Retrieve the thumbnail file for a person.",
        "operationId": "getPersonThumbnail",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get person thumbnail",
        "tags": [
          "People"
        ],
        "x-frameleaf-permission": "person.read"
      }
    },
    "/pets": {
      "get": {
        "description": "Retrieve the signed-in account’s pet identities.",
        "operationId": "getAllPets",
        "parameters": [
          {
            "name": "withHidden",
            "required": false,
            "in": "query",
            "description": "Include hidden pets",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/PetResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve pets",
        "tags": [
          "Pets"
        ],
        "x-frameleaf-permission": "all"
      },
      "post": {
        "description": "Create a durable pet identity with a name, species and optional birthday.",
        "operationId": "createPet",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PetCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PetResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a pet",
        "tags": [
          "Pets"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/pets/candidates/{id}/accept": {
      "post": {
        "description": "Record a durable confirmed observation for the proposed pet, or for a different pet when one is supplied.",
        "operationId": "acceptPetCandidate",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PetCandidateReviewDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PetObservationResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Accept a pet recognition candidate",
        "tags": [
          "Pets"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/pets/candidates/{id}/reject": {
      "post": {
        "description": "Record a durable rejection so the proposal does not return after the model is rerun.",
        "operationId": "rejectPetCandidate",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PetCandidateRejectDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PetObservationResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Reject a pet recognition candidate",
        "tags": [
          "Pets"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/pets/observations": {
      "get": {
        "description": "Retrieve the signed-in account’s decisions about which of its pets appear in one asset.",
        "operationId": "getAssetPetObservations",
        "parameters": [
          {
            "name": "assetId",
            "required": true,
            "in": "query",
            "description": "Asset whose pet observations to list",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/PetObservationResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve the pet observations of an asset",
        "tags": [
          "Pets"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/pets/observations/{id}": {
      "delete": {
        "description": "Undo a durable observation, whether it was drawn by hand or made in review. With `expectedChecksum`, refused with 409 when the original changed.",
        "operationId": "deletePetObservation",
        "parameters": [
          {
            "name": "expectedChecksum",
            "required": false,
            "in": "query",
            "description": "Checksum of the original the decision was made on (base64); refused with 409 when it changed",
            "schema": {
              "minLength": 1,
              "maxLength": 200,
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Remove a pet observation",
        "tags": [
          "Pets"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/pets/{id}": {
      "delete": {
        "description": "Delete a pet identity and every observation recorded for it.",
        "operationId": "deletePet",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a pet",
        "tags": [
          "Pets"
        ],
        "x-frameleaf-permission": "all"
      },
      "get": {
        "description": "Retrieve a single pet identity.",
        "operationId": "getPet",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PetResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve a pet",
        "tags": [
          "Pets"
        ],
        "x-frameleaf-permission": "all"
      },
      "put": {
        "description": "Update a pet’s name, species, birthday, featured photo, hidden or favorite state.",
        "operationId": "updatePet",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PetUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PetResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update a pet",
        "tags": [
          "Pets"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/pets/{id}/merge": {
      "post": {
        "description": "Merge other pet identities into this one, keeping every durable observation.",
        "operationId": "mergePets",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PetMergeDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PetResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Merge pets",
        "tags": [
          "Pets"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/pets/{id}/observations": {
      "get": {
        "description": "Retrieve the durable observations recorded for a pet.",
        "operationId": "getPetObservations",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/PetObservationResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve pet observations",
        "tags": [
          "Pets"
        ],
        "x-frameleaf-permission": "all"
      },
      "post": {
        "description": "Record by hand that a pet appears in an asset, optionally with a drawn region.",
        "operationId": "createPetObservation",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PetObservationCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PetObservationResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Add a pet observation",
        "tags": [
          "Pets"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/galleries/{id}": {
      "get": {
        "operationId": "photographyGallery",
        "parameters": [
          {
            "name": "X-Photography-Session",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyGalleryDto"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "Studio projects"
        ],
        "security": []
      }
    },
    "/photography/galleries/{id}/approve": {
      "post": {
        "operationId": "photographyApprove",
        "parameters": [
          {
            "name": "X-Photography-Session",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyGuestApprovalDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyGalleryDto"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "Studio projects"
        ],
        "security": []
      }
    },
    "/photography/galleries/{id}/choices": {
      "put": {
        "operationId": "photographyChoices",
        "parameters": [
          {
            "name": "X-Photography-Session",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyChoicesDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyGalleryDto"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "Studio projects"
        ],
        "security": []
      }
    },
    "/photography/galleries/{id}/logo": {
      "get": {
        "operationId": "photographyLogo",
        "parameters": [
          {
            "name": "X-Photography-Session",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "Studio projects"
        ],
        "security": []
      }
    },
    "/photography/galleries/{id}/orders/{orderId}/accept": {
      "post": {
        "operationId": "photographyAccept",
        "parameters": [
          {
            "name": "X-Photography-Session",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "orderId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyOrderAcceptDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyGalleryDto"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "Studio projects"
        ],
        "security": []
      }
    },
    "/photography/galleries/{id}/orders/{orderId}/checkout": {
      "post": {
        "operationId": "photographyCheckout",
        "parameters": [
          {
            "name": "X-Photography-Session",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "orderId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyCheckoutDto"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "Studio projects"
        ],
        "security": []
      }
    },
    "/photography/galleries/{id}/photos/{captureId}/outputs/{outputId}": {
      "get": {
        "operationId": "photographyOutput",
        "parameters": [
          {
            "name": "X-Photography-Session",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            }
          },
          {
            "name": "captureId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "outputId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "Studio projects"
        ],
        "security": []
      }
    },
    "/photography/galleries/{id}/photos/{captureId}/outputs/{outputId}/preview": {
      "get": {
        "operationId": "photographyOutputPreview",
        "parameters": [
          {
            "name": "X-Photography-Session",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            }
          },
          {
            "name": "captureId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "outputId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "Studio projects"
        ],
        "security": []
      }
    },
    "/photography/galleries/{id}/photos/{captureId}/{kind}": {
      "get": {
        "operationId": "photographyFile",
        "parameters": [
          {
            "name": "X-Photography-Session",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            }
          },
          {
            "name": "captureId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "kind",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "Studio projects"
        ],
        "security": []
      }
    },
    "/photography/galleries/{id}/session": {
      "post": {
        "operationId": "photographySession",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyGallerySessionDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyGallerySessionResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "Studio projects"
        ],
        "security": []
      }
    },
    "/photography/galleries/{id}/submit": {
      "post": {
        "operationId": "photographySubmit",
        "parameters": [
          {
            "name": "X-Photography-Session",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyWorkflowMutationDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyGalleryDto"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "Studio projects"
        ],
        "security": []
      }
    },
    "/photography/galleries/{id}/zip": {
      "post": {
        "operationId": "photographyZip",
        "parameters": [
          {
            "name": "X-Photography-Session",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyZipDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyZipResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "Studio projects"
        ],
        "security": []
      }
    },
    "/photography/galleries/{id}/zip/{zipId}": {
      "get": {
        "operationId": "photographyArchive",
        "parameters": [
          {
            "name": "X-Photography-Session",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "zipId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "Studio projects"
        ],
        "security": []
      }
    },
    "/photography/payments/stripe": {
      "post": {
        "operationId": "photographyCallback",
        "parameters": [
          {
            "name": "Stripe-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": true,
                "description": "Signed Stripe event JSON. Signature verification requires its unchanged raw bytes.",
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyCallbackDto"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "Studio projects"
        ],
        "security": []
      }
    },
    "/photography/presets": {
      "get": {
        "operationId": "photographyStudioPresets",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyStudioPresetsDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      },
      "post": {
        "operationId": "photographySaveStudioPreset",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyPresetSaveDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyStudioPresetsDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/shoots": {
      "get": {
        "operationId": "getPhotographyWorkspace",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyWorkspaceDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Read your private shoots",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      },
      "put": {
        "operationId": "savePhotographyWorkspace",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyWorkspaceSaveDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyWorkspaceDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Save your shoots using the loaded revision",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/shoots/branding": {
      "get": {
        "operationId": "getPhotographyBrand",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyBrandDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Read your private studio branding",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      },
      "put": {
        "operationId": "savePhotographyBrand",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyBrandSaveDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyBrandDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Save private studio branding with the workspace revision",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/shoots/branding/logos": {
      "get": {
        "operationId": "getPhotographyLogos",
        "parameters": [
          {
            "name": "cursor",
            "required": false,
            "in": "query",
            "schema": {
              "minLength": 1,
              "maxLength": 500,
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyLogoCandidatesDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List your eligible unlocked studio logo images",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/shoots/branding/logos/{id}/thumbnail": {
      "get": {
        "operationId": "getPhotographyLogoThumbnail",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "variant",
            "required": false,
            "in": "query",
            "schema": {
              "default": "original",
              "type": "string",
              "enum": [
                "original",
                "light",
                "dark"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "View an eligible owned logo thumbnail without original metadata",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/shoots/branding/preview": {
      "post": {
        "operationId": "previewPhotographyWatermark",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyRenditionPreviewDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Preview a watermark using the production font metrics and renderer",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/shoots/{id}/photos": {
      "get": {
        "operationId": "getPhotographyPhotos",
        "parameters": [
          {
            "name": "cursor",
            "required": false,
            "in": "query",
            "schema": {
              "minLength": 1,
              "maxLength": 500,
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyPhotosDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Read a page of unlocked shoot photos",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/shoots/{id}/rating": {
      "patch": {
        "operationId": "ratePhotographyPhoto",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyRatingDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Rate or reject an owned photo in your shoot",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/site": {
      "get": {
        "operationId": "photographySite",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographySiteDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      },
      "put": {
        "operationId": "photographySaveSite",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographySiteSaveDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographySiteDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/studios/{ownerId}": {
      "get": {
        "operationId": "photographyPublicSite",
        "parameters": [
          {
            "name": "ownerId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyPublicSiteDto"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "Studio projects"
        ],
        "security": []
      }
    },
    "/photography/studios/{ownerId}/logo": {
      "get": {
        "operationId": "photographyPublicLogo",
        "parameters": [
          {
            "name": "ownerId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "Studio projects"
        ],
        "security": []
      }
    },
    "/photography/studios/{ownerId}/photos/{shootId}/{captureId}": {
      "get": {
        "operationId": "photographyPublicPhoto",
        "parameters": [
          {
            "name": "captureId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ownerId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "shootId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "Studio projects"
        ],
        "security": []
      }
    },
    "/photography/workflows": {
      "get": {
        "operationId": "photographyList",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyWorkflowListDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/workflows/{id}": {
      "get": {
        "operationId": "photographyGet",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyWorkflowDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/workflows/{id}/approvals": {
      "post": {
        "operationId": "photographyApproval",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyApprovalDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyWorkflowDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/workflows/{id}/assembly": {
      "put": {
        "operationId": "photographyAssembly",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyAssemblyDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyWorkflowDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/workflows/{id}/captures/{captureId}/retry-processing": {
      "post": {
        "operationId": "photographyRetryCapture",
        "parameters": [
          {
            "name": "captureId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyWorkflowMutationDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyWorkflowDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/workflows/{id}/intake": {
      "post": {
        "operationId": "photographyIntake",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyIntakeDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyWorkflowDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/workflows/{id}/orders": {
      "post": {
        "operationId": "photographyOrder",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyOrderCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyWorkflowDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/workflows/{id}/orders/{orderId}/payment": {
      "post": {
        "operationId": "photographyPayment",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "orderId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyPaymentDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyWorkflowDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/workflows/{id}/presets": {
      "post": {
        "operationId": "photographySavePreset",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyPresetSaveDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyWorkflowDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/workflows/{id}/presets/{presetId}/apply": {
      "post": {
        "operationId": "photographyApplyPreset",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "presetId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyWorkflowMutationDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyWorkflowDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/workflows/{id}/publish": {
      "post": {
        "operationId": "photographyPublish",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyPublicationDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyWorkflowDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/workflows/{id}/recipients": {
      "post": {
        "operationId": "photographyInvite",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyRecipientCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyInvitationDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/workflows/{id}/recipients/{recipientId}": {
      "patch": {
        "operationId": "photographyRecipient",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "recipientId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyRecipientUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyWorkflowDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/workflows/{id}/retry": {
      "post": {
        "operationId": "photographyRetry",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyWorkflowMutationDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyWorkflowDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/photography/workflows/{id}/studio-presets/{presetId}/apply": {
      "post": {
        "operationId": "photographyApplyStudioPreset",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "presetId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhotographyStudioPresetApplyDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhotographyWorkflowDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/plugins": {
      "get": {
        "description": "Retrieve a list of plugins available to the authenticated user.",
        "operationId": "searchPlugins",
        "parameters": [
          {
            "name": "description",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "enabled",
            "required": false,
            "in": "query",
            "description": "Whether the plugin is enabled",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "id",
            "required": false,
            "in": "query",
            "description": "Plugin ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "name",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "title",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "version",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/PluginResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List all plugins",
        "tags": [
          "Plugins"
        ],
        "x-frameleaf-permission": "plugin.read"
      }
    },
    "/plugins/methods": {
      "get": {
        "description": "Retrieve a list of plugin methods",
        "operationId": "searchPluginMethods",
        "parameters": [
          {
            "name": "description",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "enabled",
            "required": false,
            "in": "query",
            "description": "Whether the plugin method is enabled",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "id",
            "required": false,
            "in": "query",
            "description": "Plugin method ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "name",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pluginName",
            "required": false,
            "in": "query",
            "description": "Plugin name",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pluginVersion",
            "required": false,
            "in": "query",
            "description": "Plugin version",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "title",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trigger",
            "required": false,
            "in": "query",
            "description": "Workflow trigger",
            "schema": {
              "$ref": "#/components/schemas/WorkflowTrigger"
            }
          },
          {
            "name": "type",
            "required": false,
            "in": "query",
            "description": "Workflow types",
            "schema": {
              "$ref": "#/components/schemas/WorkflowType"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/PluginMethodResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve plugin methods",
        "tags": [
          "Plugins"
        ],
        "x-frameleaf-permission": "plugin.read"
      }
    },
    "/plugins/templates": {
      "get": {
        "description": "Retrieve workflow templates provided by installed plugins",
        "operationId": "searchPluginTemplates",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/PluginTemplateResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve workflow templates",
        "tags": [
          "Plugins"
        ],
        "x-frameleaf-permission": "plugin.read"
      }
    },
    "/plugins/{id}": {
      "get": {
        "description": "Retrieve information about a specific plugin by its ID.",
        "operationId": "getPlugin",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PluginResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve a plugin",
        "tags": [
          "Plugins"
        ],
        "x-frameleaf-permission": "plugin.read"
      }
    },
    "/preservation/packages/{id}": {
      "delete": {
        "description": "Deletes the package’s own copy on this server. Your library’s originals are never touched, and a package named on the server by an administrator is only forgotten.",
        "operationId": "removePreservationPackage",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Remove a preservation package",
        "tags": [
          "Preservation"
        ],
        "x-frameleaf-permission": "asset.download"
      }
    },
    "/preservation/packages/{id}/download": {
      "get": {
        "description": "The package this server wrote, as one ZIP. A package holding Locked items needs an unlocked session. Verify the downloaded copy before relying on it.",
        "operationId": "downloadPreservationPackage",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Download a preservation package",
        "tags": [
          "Preservation"
        ],
        "x-frameleaf-permission": "asset.download"
      }
    },
    "/preservation/packages/{id}/items": {
      "get": {
        "description": "Each item of the package with its state, last verification and checksum. Locked items are counted but not named until the session is unlocked.",
        "operationId": "getPreservationPackageItems",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "skip",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 0,
              "maximum": 9007199254740991,
              "type": "integer"
            }
          },
          {
            "name": "state",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/PreservationItemState"
            }
          },
          {
            "name": "take",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 200,
              "type": "integer"
            }
          },
          {
            "name": "verifyState",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/PreservationVerifyState"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PreservationItemsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get a preservation package item report",
        "tags": [
          "Preservation"
        ],
        "x-frameleaf-permission": "asset.download"
      }
    },
    "/preservation/packages/{id}/manifest": {
      "get": {
        "description": "The manifest of a package this server wrote.",
        "operationId": "downloadPreservationManifest",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Download a preservation manifest",
        "tags": [
          "Preservation"
        ],
        "x-frameleaf-permission": "asset.download"
      }
    },
    "/preservation/preview": {
      "post": {
        "description": "How many of your items a selection holds, how large they are, whether they fit in one package and what a restoration brings back. Writes nothing.",
        "operationId": "previewPreservationExport",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PreservationPreviewDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PreservationPreviewResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Preview a preservation export",
        "tags": [
          "Preservation"
        ],
        "x-frameleaf-permission": "asset.download"
      }
    },
    "/preservation/restores/{id}/items": {
      "get": {
        "description": "What the review found for each item — new, already in your library, or in the trash — the fields that disagree, your choices and what the restore left for you to look at.",
        "operationId": "getPreservationRestoreItems",
        "parameters": [
          {
            "name": "filter",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/PreservationRestoreItemFilter"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "skip",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 0,
              "maximum": 9007199254740991,
              "type": "integer"
            }
          },
          {
            "name": "take",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 200,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PreservationRestoreItemsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get restoration items",
        "tags": [
          "Preservation"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/queues": {
      "get": {
        "description": "Retrieves a list of queues.",
        "operationId": "getQueues",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/QueueResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List all queues",
        "tags": [
          "Queues"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "queue.read"
      }
    },
    "/queues/{name}": {
      "get": {
        "description": "Retrieves a specific queue by its name.",
        "operationId": "getQueue",
        "parameters": [
          {
            "name": "name",
            "required": true,
            "in": "path",
            "schema": {
              "$ref": "#/components/schemas/QueueName"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QueueResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve a queue",
        "tags": [
          "Queues"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "queue.read"
      },
      "put": {
        "description": "Change the paused status of a specific queue.",
        "operationId": "updateQueue",
        "parameters": [
          {
            "name": "name",
            "required": true,
            "in": "path",
            "schema": {
              "$ref": "#/components/schemas/QueueName"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QueueUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QueueResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update a queue",
        "tags": [
          "Queues"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "queue.update"
      }
    },
    "/queues/{name}/jobs": {
      "delete": {
        "description": "Removes all jobs from the specified queue.",
        "operationId": "emptyQueue",
        "parameters": [
          {
            "name": "name",
            "required": true,
            "in": "path",
            "schema": {
              "$ref": "#/components/schemas/QueueName"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QueueDeleteDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Empty a queue",
        "tags": [
          "Queues"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "queueJob.delete"
      }
    },
    "/queues/{name}/jobs/retry-failed": {
      "post": {
        "description": "Puts every failed job of the specified queue back in the queue with its saved data.",
        "operationId": "retryFailedQueueJobs",
        "parameters": [
          {
            "name": "name",
            "required": true,
            "in": "path",
            "schema": {
              "$ref": "#/components/schemas/QueueName"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QueueRetryFailedResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retry failed queue jobs",
        "tags": [
          "Queues"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "queueJob.create"
      }
    },
    "/queues/{name}/statistics": {
      "get": {
        "description": "Counts, per state, the jobs of the specified queue that work on one account's items. At most 1,000 jobs of each state are read; `truncated` marks lower bounds.",
        "operationId": "getQueueOwnerStatistics",
        "parameters": [
          {
            "name": "name",
            "required": true,
            "in": "path",
            "schema": {
              "$ref": "#/components/schemas/QueueName"
            }
          },
          {
            "name": "ownerId",
            "required": true,
            "in": "query",
            "description": "The account whose jobs are counted",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QueueOwnerStatisticsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve queue statistics for an account",
        "tags": [
          "Queues"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "queueJob.read"
      }
    },
    "/search/ask": {
      "post": {
        "description": "Interpret a natural language query locally and search assets with existing search primitives.",
        "operationId": "askSearch",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AskSearchDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AskSearchResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Ask Search",
        "tags": [
          "Search"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/search/cities": {
      "get": {
        "description": "Retrieve a list of assets with each asset belonging to a different city. This endpoint is used on the places pages to show a single thumbnail for each city the user has assets in.",
        "operationId": "getAssetsByCity",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AssetResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve assets by city",
        "tags": [
          "Search"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/search/cities/counts": {
      "get": {
        "description": "Retrieve how many timeline photos and videos the user can see in each city. Counts include videos, while GET /search/cities lists only cities with at least one photo, so a city that has only videos appears here but not in that list. Locked, hidden and trashed media are never counted.",
        "operationId": "getCityAssetCounts",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/SearchCityCountResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve asset counts by city",
        "tags": [
          "Search"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/search/explore": {
      "get": {
        "description": "Retrieve data for the explore section, such as popular people and places.",
        "operationId": "getExploreData",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/SearchExploreResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve explore data",
        "tags": [
          "Search"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/search/facets": {
      "post": {
        "description": "Count the assets a metadata search body matches by people, media type, places, cameras, lenses, rating, favorites and tags. People and tags are the caller's own; places of partners who hide their locations are left out.",
        "operationId": "searchFacets",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SearchFacetsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchFacetsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Search facet counts",
        "tags": [
          "Search"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/search/histogram": {
      "post": {
        "description": "Count the assets a metadata search body matches per local capture day, month or year. The buckets add up to the POST /search/statistics total for the same body.",
        "operationId": "searchHistogram",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SearchHistogramDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchHistogramResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Search date histogram",
        "tags": [
          "Search"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/search/large-assets": {
      "post": {
        "description": "Search for assets that are considered large based on specified criteria.",
        "operationId": "searchLargeAssets",
        "parameters": [
          {
            "name": "albumIds",
            "required": false,
            "in": "query",
            "description": "Filter by album IDs",
            "deprecated": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$"
              }
            }
          },
          {
            "name": "city",
            "required": false,
            "in": "query",
            "description": "Filter by city name",
            "deprecated": true,
            "schema": {
              "type": "string",
              "nullable": true
            }
          },
          {
            "name": "country",
            "required": false,
            "in": "query",
            "description": "Filter by country name",
            "deprecated": true,
            "schema": {
              "type": "string",
              "nullable": true
            }
          },
          {
            "name": "createdAfter",
            "required": false,
            "in": "query",
            "description": "Filter by creation date (after)",
            "deprecated": true,
            "schema": {
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
              "example": "2024-01-01T00:00:00.000Z",
              "type": "string"
            }
          },
          {
            "name": "createdBefore",
            "required": false,
            "in": "query",
            "description": "Filter by creation date (before)",
            "deprecated": true,
            "schema": {
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
              "example": "2024-01-01T00:00:00.000Z",
              "type": "string"
            }
          },
          {
            "name": "imageEnrichment",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/ImageEnrichmentFilter"
            }
          },
          {
            "name": "isEncoded",
            "required": false,
            "in": "query",
            "description": "Filter by encoded status",
            "deprecated": true,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isFavorite",
            "required": false,
            "in": "query",
            "description": "Filter by favorite status",
            "deprecated": true,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isMotion",
            "required": false,
            "in": "query",
            "description": "Filter by motion photo status",
            "deprecated": true,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isNotInAlbum",
            "required": false,
            "in": "query",
            "description": "Filter assets not in any album",
            "deprecated": true,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isOffline",
            "required": false,
            "in": "query",
            "description": "Filter by offline status",
            "deprecated": true,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "lensModel",
            "required": false,
            "in": "query",
            "description": "Filter by lens model",
            "deprecated": true,
            "schema": {
              "type": "string",
              "nullable": true
            }
          },
          {
            "name": "libraryId",
            "required": false,
            "in": "query",
            "description": "Library ID to filter by",
            "deprecated": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "nullable": true
            }
          },
          {
            "name": "make",
            "required": false,
            "in": "query",
            "description": "Filter by camera make",
            "deprecated": true,
            "schema": {
              "type": "string",
              "nullable": true
            }
          },
          {
            "name": "minFileSize",
            "required": false,
            "in": "query",
            "description": "Minimum file size in bytes",
            "schema": {
              "minimum": 0,
              "maximum": 9007199254740991,
              "type": "integer"
            }
          },
          {
            "name": "model",
            "required": false,
            "in": "query",
            "description": "Filter by camera model",
            "deprecated": true,
            "schema": {
              "type": "string",
              "nullable": true
            }
          },
          {
            "name": "ocr",
            "required": false,
            "in": "query",
            "description": "Filter by OCR text content",
            "deprecated": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "personIds",
            "required": false,
            "in": "query",
            "description": "Filter by person IDs",
            "deprecated": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$"
              }
            }
          },
          {
            "name": "petIds",
            "required": false,
            "in": "query",
            "description": "Filter by the caller's own pet IDs (confirmed pet observations only)",
            "deprecated": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$"
              }
            }
          },
          {
            "name": "rating",
            "required": false,
            "in": "query",
            "description": "Filter by rating [1-5], or null for unrated",
            "deprecated": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5,
              "nullable": true
            }
          },
          {
            "name": "size",
            "required": false,
            "in": "query",
            "description": "Number of results to return",
            "schema": {
              "minimum": 1,
              "maximum": 1000,
              "type": "integer"
            }
          },
          {
            "name": "state",
            "required": false,
            "in": "query",
            "description": "Filter by state/province name",
            "deprecated": true,
            "schema": {
              "type": "string",
              "nullable": true
            }
          },
          {
            "name": "suppressedOnly",
            "required": false,
            "in": "query",
            "description": "Return only suppressed content. Requires an elevated session.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "tagIds",
            "required": false,
            "in": "query",
            "description": "Filter by tag IDs",
            "deprecated": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$"
              },
              "nullable": true
            }
          },
          {
            "name": "takenAfter",
            "required": false,
            "in": "query",
            "description": "Filter by taken date (after)",
            "deprecated": true,
            "schema": {
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
              "example": "2024-01-01T00:00:00.000Z",
              "type": "string"
            }
          },
          {
            "name": "takenBefore",
            "required": false,
            "in": "query",
            "description": "Filter by taken date (before)",
            "deprecated": true,
            "schema": {
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
              "example": "2024-01-01T00:00:00.000Z",
              "type": "string"
            }
          },
          {
            "name": "trashedAfter",
            "required": false,
            "in": "query",
            "description": "Filter by trash date (after)",
            "deprecated": true,
            "schema": {
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
              "example": "2024-01-01T00:00:00.000Z",
              "type": "string"
            }
          },
          {
            "name": "trashedBefore",
            "required": false,
            "in": "query",
            "description": "Filter by trash date (before)",
            "deprecated": true,
            "schema": {
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
              "example": "2024-01-01T00:00:00.000Z",
              "type": "string"
            }
          },
          {
            "name": "type",
            "required": false,
            "in": "query",
            "deprecated": true,
            "schema": {
              "$ref": "#/components/schemas/AssetTypeEnum"
            }
          },
          {
            "name": "updatedAfter",
            "required": false,
            "in": "query",
            "description": "Filter by update date (after)",
            "deprecated": true,
            "schema": {
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
              "example": "2024-01-01T00:00:00.000Z",
              "type": "string"
            }
          },
          {
            "name": "updatedBefore",
            "required": false,
            "in": "query",
            "description": "Filter by update date (before)",
            "deprecated": true,
            "schema": {
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
              "example": "2024-01-01T00:00:00.000Z",
              "type": "string"
            }
          },
          {
            "name": "visibility",
            "required": false,
            "in": "query",
            "deprecated": true,
            "schema": {
              "$ref": "#/components/schemas/AssetVisibility"
            }
          },
          {
            "name": "withDeleted",
            "required": false,
            "in": "query",
            "description": "Include deleted assets",
            "deprecated": true,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "withExif",
            "required": false,
            "in": "query",
            "description": "Include EXIF data in response",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AssetResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Search large assets",
        "tags": [
          "Search"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/search/metadata": {
      "post": {
        "description": "Search for assets based on various metadata criteria.",
        "operationId": "searchAssets",
        "parameters": [
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataSearchDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Search assets by metadata",
        "tags": [
          "Search"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/search/person": {
      "get": {
        "description": "Search for people by name.",
        "operationId": "searchPerson",
        "parameters": [
          {
            "name": "name",
            "required": true,
            "in": "query",
            "description": "Person name to search for",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "withHidden",
            "required": false,
            "in": "query",
            "description": "Include hidden people",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/PersonResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Search people",
        "tags": [
          "Search"
        ],
        "x-frameleaf-permission": "person.read"
      }
    },
    "/search/places": {
      "get": {
        "description": "Search for places by name.",
        "operationId": "searchPlaces",
        "parameters": [
          {
            "name": "name",
            "required": true,
            "in": "query",
            "description": "Place name to search for",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/PlacesResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Search places",
        "tags": [
          "Search"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/search/random": {
      "post": {
        "description": "Retrieve a random selection of assets based on the provided criteria.",
        "operationId": "searchRandom",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RandomSearchDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AssetResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Search random assets",
        "tags": [
          "Search"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/search/smart": {
      "post": {
        "description": "Perform a smart search for assets by using machine learning vectors to determine relevance.",
        "operationId": "searchSmart",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SmartSearchDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Smart asset search",
        "tags": [
          "Search"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/search/smart/statistics": {
      "post": {
        "description": "How many assets a smart search body would rank, counted up to 1000 and flagged when capped. No text is encoded to answer it.",
        "operationId": "searchSmartStatistics",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SmartSearchDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SmartSearchStatisticsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Smart search statistics",
        "tags": [
          "Search"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/search/statistics": {
      "post": {
        "description": "Retrieve statistical data about assets based on search criteria, such as the total matching count.",
        "operationId": "searchAssetStatistics",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StatisticsSearchDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchStatisticsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Search asset statistics",
        "tags": [
          "Search"
        ],
        "x-frameleaf-permission": "asset.statistics"
      }
    },
    "/search/suggestions": {
      "get": {
        "description": "Retrieve search suggestions based on partial input. This endpoint is used for typeahead search features.",
        "operationId": "getSearchSuggestions",
        "parameters": [
          {
            "name": "country",
            "required": false,
            "in": "query",
            "description": "Filter by country",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "includeNull",
            "required": false,
            "in": "query",
            "description": "Include null values in suggestions",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "lensModel",
            "required": false,
            "in": "query",
            "description": "Filter by lens model",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "make",
            "required": false,
            "in": "query",
            "description": "Filter by camera make",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "model",
            "required": false,
            "in": "query",
            "description": "Filter by camera model",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "state",
            "required": false,
            "in": "query",
            "description": "Filter by state/province",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "required": true,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/SearchSuggestionType"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve search suggestions",
        "tags": [
          "Search"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/server/apk-links": {
      "get": {
        "description": "Retrieve links to the signed APKs for the current server version, from the release destination configured for this server.",
        "operationId": "getApkLinks",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerApkLinksDto"
                }
              }
            },
            "description": ""
          },
          "404": {
            "description": "No signed Android release is configured for this server"
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get APK links",
        "tags": [
          "Server"
        ],
        "x-frameleaf-permission": "server.apkLinks"
      }
    },
    "/server/app-releases": {
      "get": {
        "description": "Retrieve the signed release destinations of the mobile apps for this server, or that none is configured.",
        "operationId": "getAppReleases",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerAppReleasesResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get app releases",
        "tags": [
          "Server"
        ],
        "x-frameleaf-permission": "server.about"
      }
    },
    "/server/library-setup": {
      "get": {
        "operationId": "getLibrarySetupStatus",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LibrarySetupStatusDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Library preparation for this authenticated device",
        "tags": [
          "Server"
        ],
        "x-frameleaf-permission": "sync.stream"
      }
    },
    "/server/library-setup/begin": {
      "post": {
        "operationId": "beginLibrarySetup",
        "parameters": [],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LibrarySetupStatusDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Start the managed library rescan",
        "tags": [
          "Server"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "all"
      }
    },
    "/server/library-setup/finish": {
      "post": {
        "operationId": "finishLibrarySetup",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FinishLibrarySetupDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LibrarySetupStatusDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Finish after catalog and browsing previews are cached",
        "tags": [
          "Server"
        ],
        "x-frameleaf-permission": "sync.stream"
      }
    },
    "/server/library-setup/manager": {
      "get": {
        "operationId": "getManagerLibrarySetup",
        "parameters": [
          {
            "name": "x-frameleaf-manager",
            "required": true,
            "in": "header",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LibrarySetupStatusDto"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Manager machine-authenticated setup status",
        "tags": [
          "Server"
        ],
        "security": []
      },
      "post": {
        "operationId": "beginManagerLibrarySetup",
        "parameters": [
          {
            "name": "x-frameleaf-manager",
            "required": true,
            "in": "header",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LibrarySetupStatusDto"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Manager machine-authenticated rescan",
        "tags": [
          "Server"
        ],
        "security": []
      }
    },
    "/server/media-types": {
      "get": {
        "description": "Retrieve all media types supported by the server.",
        "operationId": "getSupportedMediaTypes",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerMediaTypesResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Get supported media types",
        "tags": [
          "Server"
        ],
        "security": []
      }
    },
    "/server/statistics": {
      "get": {
        "description": "Retrieve statistics about the entire Frameleaf instance such as asset counts.",
        "operationId": "getServerStatistics",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerStatsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get statistics",
        "tags": [
          "Server"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "server.statistics"
      }
    },
    "/server/storage": {
      "get": {
        "description": "Retrieve the current storage utilization information of the server.",
        "operationId": "getStorage",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerStorageResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get storage",
        "tags": [
          "Server"
        ],
        "x-frameleaf-permission": "server.storage"
      }
    },
    "/server/version": {
      "get": {
        "description": "Retrieve the current server version in semantic versioning (semver) format.",
        "operationId": "getServerVersion",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerVersionResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Get server version",
        "tags": [
          "Server"
        ],
        "security": []
      }
    },
    "/server/version-check": {
      "get": {
        "description": "Retrieve information about the last time the version check ran.",
        "operationId": "getVersionCheck",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VersionCheckStateResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get version check status",
        "tags": [
          "Server"
        ],
        "x-frameleaf-permission": "server.versionCheck"
      },
      "post": {
        "description": "Ask Frameleaf's release feed for the newest version now, whether or not automatic checks are on (About → Check for updates). No other service is contacted.",
        "operationId": "checkVersionNow",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReleaseEventV1"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Check for updates now",
        "tags": [
          "Server"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "server.versionCheck"
      }
    },
    "/server/version-history": {
      "get": {
        "description": "Retrieve a list of past versions the server has been on.",
        "operationId": "getVersionHistory",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/ServerVersionHistoryResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Get version history",
        "tags": [
          "Server"
        ],
        "security": []
      }
    },
    "/sessions": {
      "delete": {
        "description": "Delete all sessions for the user. This will not delete the current session.",
        "operationId": "deleteAllSessions",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete all sessions",
        "tags": [
          "Sessions"
        ],
        "x-frameleaf-permission": "session.delete"
      },
      "get": {
        "description": "Retrieve a list of sessions for the user.",
        "operationId": "getSessions",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/SessionResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve sessions",
        "tags": [
          "Sessions"
        ],
        "x-frameleaf-permission": "session.read"
      },
      "post": {
        "description": "Create a session as a child to the current session. This endpoint is used for casting.",
        "operationId": "createSession",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SessionCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionCreateResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a session",
        "tags": [
          "Sessions"
        ],
        "x-frameleaf-permission": "session.create"
      }
    },
    "/sessions/{id}": {
      "delete": {
        "description": "Delete a specific session by id.",
        "operationId": "deleteSession",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a session",
        "tags": [
          "Sessions"
        ],
        "x-frameleaf-permission": "session.delete"
      },
      "put": {
        "deprecated": true,
        "description": "Update a specific session identified by id.",
        "operationId": "updateSession",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SessionUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update a session",
        "tags": [
          "Sessions",
          "Deprecated"
        ],
        "x-frameleaf-permission": "session.update"
      }
    },
    "/sessions/{id}/lock": {
      "post": {
        "description": "Lock a specific session by id.",
        "operationId": "lockSession",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Lock a session",
        "tags": [
          "Sessions"
        ],
        "x-frameleaf-permission": "session.lock"
      }
    },
    "/shared-links": {
      "get": {
        "description": "Retrieve a list of all shared links.",
        "operationId": "getAllSharedLinks",
        "parameters": [
          {
            "name": "albumId",
            "required": false,
            "in": "query",
            "description": "Filter by album ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": false,
            "in": "query",
            "description": "Filter by shared link ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/SharedLinkResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve all shared links",
        "tags": [
          "Shared links"
        ],
        "x-frameleaf-permission": "sharedLink.read"
      },
      "post": {
        "description": "Create a new shared link.",
        "operationId": "createSharedLink",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SharedLinkCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SharedLinkResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a shared link",
        "tags": [
          "Shared links"
        ],
        "x-frameleaf-permission": "sharedLink.create"
      }
    },
    "/shared-links/{id}": {
      "delete": {
        "description": "Delete a specific shared link by its ID.",
        "operationId": "removeSharedLink",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a shared link",
        "tags": [
          "Shared links"
        ],
        "x-frameleaf-permission": "sharedLink.delete"
      },
      "get": {
        "description": "Retrieve a specific shared link by its ID.",
        "operationId": "getSharedLinkById",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SharedLinkResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve a shared link",
        "tags": [
          "Shared links"
        ],
        "x-frameleaf-permission": "sharedLink.read"
      },
      "patch": {
        "description": "Update an existing shared link by its ID.",
        "operationId": "updateSharedLink",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SharedLinkEditDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SharedLinkResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update a shared link",
        "tags": [
          "Shared links"
        ],
        "x-frameleaf-permission": "sharedLink.update"
      }
    },
    "/shared-links/{id}/assets": {
      "delete": {
        "description": "Remove assets from a specific shared link by its ID. This endpoint is only relevant for shared link of type individual.",
        "operationId": "removeSharedLinkAssets",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetIdsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AssetIdsResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Remove assets from a shared link",
        "tags": [
          "Shared links"
        ],
        "x-frameleaf-permission": "sharedLink.update"
      },
      "put": {
        "description": "Add assets to a specific shared link by its ID. This endpoint is only relevant for shared link of type individual.",
        "operationId": "addSharedLinkAssets",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetIdsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AssetIdsResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Add assets to a shared link",
        "tags": [
          "Shared links"
        ],
        "x-frameleaf-permission": "sharedLink.update"
      }
    },
    "/shared-spaces/invitations": {
      "get": {
        "description": "Shared spaces the authenticated user has been invited to and has not answered. Each entry is the same safe preview as GET /shared-spaces/{id}/preview: no assets, and counts that exclude media marked sensitive and Locked media.",
        "operationId": "getSharedSpaceInvitations",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/SharedSpacePreviewResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List shared space invitations",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "album.read"
      }
    },
    "/shared-spaces/recipient-groups": {
      "get": {
        "description": "The authenticated user's own named groups of people to invite to a shared space together. A group is a shortcut only: it grants nothing, and its name is never shown to anyone but its owner.",
        "operationId": "getRecipientGroups",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/RecipientGroupResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List recipient groups",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "album.read"
      },
      "post": {
        "description": "Save a named group of people to invite together. Nobody is invited or given access until the group is applied to a shared space and its invitations are sent.",
        "operationId": "createRecipientGroup",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecipientGroupCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecipientGroupResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a recipient group",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "album.share"
      }
    },
    "/shared-spaces/recipient-groups/{id}": {
      "delete": {
        "description": "Delete one of your recipient groups. Nobody loses access to anything.",
        "operationId": "deleteRecipientGroup",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a recipient group",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "album.share"
      },
      "put": {
        "description": "Rename a group or change who is in it. Existing invitations and memberships are never changed; only the owner's own groups can be updated (anyone else's reads as not found).",
        "operationId": "updateRecipientGroup",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecipientGroupUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecipientGroupResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update a recipient group",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "album.share"
      }
    },
    "/shared-spaces/{id}/accept": {
      "post": {
        "description": "Join the shared space with the role its owner offered. The role comes from the stored invitation, never from the request. This is the only way to become a member of a space.",
        "operationId": "acceptSharedSpaceInvitation",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlbumResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Accept a shared space invitation",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "albumUser.update"
      }
    },
    "/shared-spaces/{id}/activity": {
      "get": {
        "description": "The shared space’s activity feed, newest first: items added and removed, albums and people linked and unlinked, members joining, leaving, being removed or changing role, comments and likes — by every member. Only current members may read it. Every event is narrowed to the caller before it is sent: an item the caller cannot see (Locked, marked sensitive, hidden by their own settings, or no longer in the space) is never named, and an event with nothing visible left is not sent at all, so nothing can be inferred from a count. `unreadCount` is the events by other members since the caller last marked the space seen, computed the same way. Page with `before` and `take`.",
        "operationId": "getSharedSpaceActivity",
        "parameters": [
          {
            "name": "before",
            "required": false,
            "in": "query",
            "description": "Only events before this moment, for paging",
            "schema": {
              "format": "date-time",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "take",
            "required": false,
            "in": "query",
            "description": "Page size, 50 by default",
            "schema": {
              "minimum": 1,
              "maximum": 200,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SharedSpaceActivityResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "What happened in a shared space",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "album.read"
      }
    },
    "/shared-spaces/{id}/albums": {
      "get": {
        "description": "The albums members have linked into the shared space, one level: a space links albums, never another space and never a collection. A link is a reference, not a move and not a share — the album keeps its owner, its members, its access rules and its place in its owner’s tree, and this response grants no access to it. The count and the tile picture come only from items that are in both the album and the space, with media marked sensitive and Locked media excluded.",
        "operationId": "getSharedSpaceAlbums",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SharedSpaceAlbumsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List albums linked into a shared space",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "album.read"
      }
    },
    "/shared-spaces/{id}/albums/{albumId}": {
      "delete": {
        "description": "Remove the reference and only the reference. The album, its items, its members and the shared space’s own items are untouched. The member who made the link, and the shared space owner, may remove it.",
        "operationId": "unlinkSharedSpaceAlbum",
        "parameters": [
          {
            "name": "albumId",
            "required": true,
            "in": "path",
            "description": "The album to link or unlink",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Shared space ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Unlink an album from a shared space",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "album.update"
      },
      "put": {
        "description": "Point the shared space at an album the caller can already read. Nothing else happens: no item moves or is copied, no album membership changes, and the album stays where its owner put it. Linking the same album twice is the same single link. An owner or editor of the space may link; a viewer may not.",
        "operationId": "linkSharedSpaceAlbum",
        "parameters": [
          {
            "name": "albumId",
            "required": true,
            "in": "path",
            "description": "The album to link or unlink",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Shared space ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SharedSpaceAlbumsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Link an album into a shared space",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "album.update"
      }
    },
    "/shared-spaces/{id}/comments": {
      "get": {
        "description": "The comments on one item in the shared space (`assetId`), or on the space itself when `assetId` is left out. Oldest first. Only current members may read them, and an item the caller cannot see is not in the space as far as they are concerned (404). Mentions stay as `@{userId}` tokens in the text and are resolved in `mentions`. Threads are one level deep: a reply names its top-level comment in `parentId`, and a top-level comment carries its `replyCount`.",
        "operationId": "getSharedSpaceComments",
        "parameters": [
          {
            "name": "assetId",
            "required": false,
            "in": "query",
            "description": "Comments on this item. Left out, the comments on the space itself.",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SharedSpaceCommentsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List comments in a shared space",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "activity.read"
      },
      "post": {
        "description": "Write a comment on one item in the shared space, or on the space itself when `assetId` is left out. Commenting must be enabled on the space, and the item must be one the caller can see. Mention a member with `@{userId}`: mentions are by id, never by name, every mention must name a current member (400 otherwise), and each mentioned member other than the author is notified. Reply with `parentId`: a reply to a reply joins the same thread under its top-level comment, is on the same item, and notifies the top-level comment’s author in the app.",
        "operationId": "createSharedSpaceComment",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SharedSpaceCommentCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SharedSpaceCommentResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Comment in a shared space",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "activity.create"
      }
    },
    "/shared-spaces/{id}/comments/{commentId}": {
      "delete": {
        "description": "Remove a comment. Its author may, and so may a shared space owner or editor — that is how a space is moderated. A viewer removes only their own. The comment’s mentions and its entry in the activity feed go with it, and removing a top-level comment removes its replies.",
        "operationId": "deleteSharedSpaceComment",
        "parameters": [
          {
            "name": "commentId",
            "required": true,
            "in": "path",
            "description": "The comment",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Shared space ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Remove a shared space comment",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "activity.delete"
      },
      "put": {
        "description": "Change what a comment says. Only its author may. Mentions are re-read from the new text under the same rules, and members newly mentioned are notified.",
        "operationId": "updateSharedSpaceComment",
        "parameters": [
          {
            "name": "commentId",
            "required": true,
            "in": "path",
            "description": "The comment",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Shared space ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SharedSpaceCommentUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SharedSpaceCommentResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Edit a shared space comment",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "activity.update"
      }
    },
    "/shared-spaces/{id}/invitation": {
      "delete": {
        "description": "Decline the invitation. Nothing else changes: the shared space and its photos are untouched, and the owner may invite again later.",
        "operationId": "declineSharedSpaceInvitation",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Decline a shared space invitation",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "albumUser.delete"
      }
    },
    "/shared-spaces/{id}/invitations/{userId}": {
      "delete": {
        "description": "Withdraw a pending invitation. Only the shared space owner can do this, and it only reaches people who have not joined; removing a member is DELETE /albums/{id}/user/{userId}.",
        "operationId": "removeSharedSpaceInvitation",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Shared space ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "userId",
            "required": true,
            "in": "path",
            "description": "The invited user",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Withdraw a shared space invitation",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "albumUser.delete"
      }
    },
    "/shared-spaces/{id}/members": {
      "get": {
        "description": "Everyone in the shared space and everyone invited to it who has not answered. Any member may read the roster; only the owner may change it.",
        "operationId": "getSharedSpaceMembers",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SharedSpaceMembersResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List shared space members",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "album.read"
      }
    },
    "/shared-spaces/{id}/new": {
      "get": {
        "description": "Items other members added since the caller last marked this shared space seen. The marker is per member. If the caller has never marked it seen, everything in the space counts as new to them. The caller’s own additions are left out, and media marked sensitive and Locked media are excluded.",
        "operationId": "getSharedSpaceNew",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SharedSpaceNewResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "What is new in a shared space since your last visit",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "album.read"
      }
    },
    "/shared-spaces/{id}/people": {
      "get": {
        "description": "Two lists. `linked` is who members have published into the space, carrying the space’s own name for each one and a picture that is already in the space — never the owner’s private name, thumbnail, birth date or person ID. `candidates` is the caller’s own people seen on the space’s items, so they can publish one; no other member’s people are ever listed. Counts exclude media marked sensitive and Locked media.",
        "operationId": "getSharedSpacePeople",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SharedSpacePeopleResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "People in a shared space",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "album.read"
      },
      "post": {
        "description": "Publish one of the caller’s own people into the shared space under a name the space uses. The name is independent: it never renames the caller’s own person, and renaming that person does not rename it here. The caller’s person record is not disclosed to anybody. Linking the same person again rewrites the link rather than adding a second one.",
        "operationId": "linkSharedSpacePerson",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SharedSpacePersonLinkDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SharedSpacePeopleResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Link a person into a shared space",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "person.update"
      }
    },
    "/shared-spaces/{id}/people/{linkId}": {
      "delete": {
        "description": "Remove the link and only the link. The person, their name, their faces and every item that shows them are untouched, and so are the shared space’s items. The member who made the link, and the shared space owner, may remove it.",
        "operationId": "unlinkSharedSpacePerson",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Shared space ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "linkId",
            "required": true,
            "in": "path",
            "description": "The person link to remove",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Unlink a person from a shared space",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "person.update"
      }
    },
    "/shared-spaces/{id}/preview": {
      "get": {
        "description": "What the shared space exposes, for someone holding an invitation to it or already in it. The preview carries no asset: no ids, no thumbnails, no file names, no people and no places. Counts and dates exclude media marked sensitive and Locked media. Anyone without an invitation or membership gets 404.",
        "operationId": "getSharedSpacePreview",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SharedSpacePreviewResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Preview a shared space",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "album.read"
      }
    },
    "/shared-spaces/{id}/visit": {
      "post": {
        "description": "Move the caller’s own last-seen marker to now and return what is new after doing so. This is deliberately explicit rather than something opening the page does, so glancing at a space on a phone does not silently clear the list of what has not been looked at.",
        "operationId": "markSharedSpaceVisited",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SharedSpaceNewResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Mark a shared space seen",
        "tags": [
          "Shared spaces"
        ],
        "x-frameleaf-permission": "album.read"
      }
    },
    "/stacks": {
      "delete": {
        "description": "Delete multiple stacks by providing a list of stack IDs.",
        "operationId": "deleteStacks",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkIdsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete stacks",
        "tags": [
          "Stacks"
        ],
        "x-frameleaf-permission": "stack.delete"
      },
      "get": {
        "description": "Retrieve a list of stacks.",
        "operationId": "searchStacks",
        "parameters": [
          {
            "name": "primaryAssetId",
            "required": false,
            "in": "query",
            "description": "Filter by primary asset ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/StackResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve stacks",
        "tags": [
          "Stacks"
        ],
        "x-frameleaf-permission": "stack.read"
      },
      "post": {
        "description": "Create a new stack by providing a name and a list of asset IDs to include in the stack. If any of the provided asset IDs are primary assets of an existing stack, the existing stack will be merged into the newly created stack.",
        "operationId": "createStack",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StackCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StackResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a stack",
        "tags": [
          "Stacks"
        ],
        "x-frameleaf-permission": "stack.create"
      }
    },
    "/stacks/{id}": {
      "delete": {
        "description": "Delete a specific stack by its ID.",
        "operationId": "deleteStack",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a stack",
        "tags": [
          "Stacks"
        ],
        "x-frameleaf-permission": "stack.delete"
      },
      "get": {
        "description": "Retrieve a specific stack by its ID.",
        "operationId": "getStack",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StackResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve a stack",
        "tags": [
          "Stacks"
        ],
        "x-frameleaf-permission": "stack.read"
      },
      "put": {
        "deprecated": true,
        "description": "Update an existing stack by its ID.",
        "operationId": "updateStack",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StackUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StackResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update a stack",
        "tags": [
          "Stacks",
          "Deprecated"
        ],
        "x-frameleaf-permission": "stack.update"
      }
    },
    "/stacks/{id}/assets/{assetId}": {
      "delete": {
        "description": "Remove a specific asset from a stack by providing the stack ID and asset ID.",
        "operationId": "removeAssetFromStack",
        "parameters": [
          {
            "name": "assetId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Remove an asset from a stack",
        "tags": [
          "Stacks"
        ],
        "x-frameleaf-permission": "stack.update"
      }
    },
    "/studio/bundles/exports/{id}/download": {
      "get": {
        "description": "The finished file of one of your own exports. It is reachable by no other route and is deleted when it expires.",
        "operationId": "downloadStudioBundle",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Download a Studio bundle",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/bundles/uploads": {
      "post": {
        "description": "Checks the archive against every bundle limit and verifies its manifest and project document before anything is kept. Returns what the import will relink, keep and report missing.",
        "operationId": "uploadStudioBundle",
        "parameters": [],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/StudioBundleUploadCreateDto"
              }
            }
          },
          "description": "A Studio bundle to import",
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioBundleUploadDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Upload a Studio bundle",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/bundles/uploads/{id}": {
      "delete": {
        "description": "Deletes the uploaded file now rather than when it expires.",
        "operationId": "deleteStudioBundleUpload",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Discard an uploaded Studio bundle",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      },
      "get": {
        "description": "The review of an uploaded bundle, recomputed for your library as it is now.",
        "operationId": "getStudioBundleUpload",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioBundleUploadDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get an uploaded Studio bundle",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/exports/{id}/download": {
      "get": {
        "description": "The file of a published export that uses media shared with you. Available only while every source is still available to you; a result in your library is downloaded like any other photo or video.",
        "operationId": "downloadStudioExport",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Download a Studio export kept with its project",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/preview-streams": {
      "post": {
        "description": "Opens a bounded WebRTC playback session of the project's current stored revision from an exact rational time. Refused for a superseded revision, an unavailable source, or when the account already holds the most sessions it may; an open session of the same project is superseded.",
        "operationId": "openStudioPreviewStream",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudioPreviewStreamOpenDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioPreviewStreamDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Open a Studio preview stream",
        "tags": [
          "Studio previews"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/preview-streams/{id}": {
      "delete": {
        "description": "Ends the session; the worker stops sending on its next signalling poll.",
        "operationId": "closeStudioPreviewStream",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioPreviewStreamDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Close a Studio preview stream",
        "tags": [
          "Studio previews"
        ],
        "x-frameleaf-permission": "all"
      },
      "get": {
        "description": "The session's state and, while it waits for an answer, the worker's offer. Polling it is the keepalive; each poll re-checks project access and the stored head, and closes the session when either has changed.",
        "operationId": "getStudioPreviewStream",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioPreviewStreamDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get a Studio preview stream",
        "tags": [
          "Studio previews"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/preview-streams/{id}/answer": {
      "put": {
        "description": "The browser's complete answer (non-trickle ICE) to the current negotiation's offer: receive one video, send nothing. The server writes the session's bitrate bound into it before the worker reads it.",
        "operationId": "answerStudioPreviewStream",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudioPreviewStreamAnswerDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioPreviewStreamDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Answer a Studio preview stream",
        "tags": [
          "Studio previews"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/preview-streams/{id}/reconnect": {
      "post": {
        "description": "Starts the next negotiation after the peer connection dropped, only once project access, the stored head, every source's availability and the worker's lease have been validated again. Any failure closes the session with its reason.",
        "operationId": "reconnectStudioPreviewStream",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioPreviewStreamDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Reconnect a Studio preview stream",
        "tags": [
          "Studio previews"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/previews": {
      "post": {
        "description": "Asks for one frame of a project's current stored revision at an exact rational time, quality and viewport. The server reads the graph from project storage and resolves its sources for the caller; a request naming a superseded revision is refused with the current one. An identical request shares the render rather than starting a second one, and previews of superseded revisions are cancelled.",
        "operationId": "requestStudioPreview",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudioPreviewRequestDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioPreviewResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Request a Studio preview frame",
        "tags": [
          "Studio previews"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/previews/{id}": {
      "delete": {
        "description": "Retires delivery of a preview. Scoped admissions require their captured consumer and operation identities; cancellation receipt facts distinguish durable request from renderer release. An active renderer directory is retained until genuine release.",
        "operationId": "cancelStudioPreview",
        "parameters": [
          {
            "name": "consumerRequestId",
            "required": false,
            "in": "query",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          },
          {
            "name": "expectedOperationId",
            "required": false,
            "in": "query",
            "description": "Captured operation ID; literal string null explicitly names a never-enqueued admission. Omission and empty strings are not null.",
            "schema": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$"
                },
                {
                  "type": "string",
                  "enum": [
                    "null"
                  ]
                }
              ]
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioPreviewDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Cancel a Studio preview",
        "tags": [
          "Studio previews"
        ],
        "x-frameleaf-permission": "all"
      },
      "get": {
        "description": "The state of one requested frame, including its revision-bound entity tag.",
        "operationId": "getStudioPreview",
        "parameters": [
          {
            "name": "consumerRequestId",
            "required": false,
            "in": "query",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioPreviewDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get a Studio preview",
        "tags": [
          "Studio previews"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/previews/{id}/frame": {
      "get": {
        "description": "Returns the rendered frame. The entity tag contains the project revision, so a frame whose revision has been superseded is refused with 409 rather than served or revalidated.",
        "operationId": "viewStudioPreviewFrame",
        "parameters": [
          {
            "name": "consumerRequestId",
            "required": false,
            "in": "query",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "View a Studio preview frame",
        "tags": [
          "Studio previews"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/projects": {
      "get": {
        "description": "One shelf of the project library. The active shelf holds projects you own and projects shared with a space you belong to; the archive and the trash hold your own only.",
        "operationId": "searchStudioProjects",
        "parameters": [
          {
            "name": "query",
            "required": false,
            "in": "query",
            "description": "Case-insensitive part of the name",
            "schema": {
              "maxLength": 200,
              "type": "string"
            }
          },
          {
            "name": "shelf",
            "required": false,
            "in": "query",
            "description": "Which shelf to list; `active` when omitted",
            "schema": {
              "$ref": "#/components/schemas/StudioProjectShelf"
            }
          },
          {
            "name": "skip",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 0,
              "maximum": 9007199254740991,
              "default": 0,
              "type": "integer"
            }
          },
          {
            "name": "sort",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/StudioProjectSort"
            }
          },
          {
            "name": "take",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 200,
              "default": 50,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioProjectListResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List Studio projects",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      },
      "post": {
        "description": "Creates an empty project owned by you and hands the write lease to the given editor instance. An initial document, when given, is saved as revision 1.",
        "operationId": "createStudioProject",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudioProjectCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioProjectDetailDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a Studio project",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/projects/trash/empty": {
      "post": {
        "description": "Deletes every project in your Studio trash for good, with its history and comments. Media in your library is never touched.",
        "operationId": "emptyStudioProjectTrash",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioProjectTrashEmptyResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Empty the Studio trash",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/projects/{id}": {
      "delete": {
        "description": "Moves the project to the trash, where it can be restored until its retention runs out; with `permanent`, deletes it, its history and its comments now. Owner only. Media in your library is never touched, and finished jobs keep their lineage.",
        "operationId": "deleteStudioProject",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "permanent",
            "required": false,
            "in": "query",
            "description": "Delete for good instead of moving to the trash. Library media is never touched either way.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a Studio project",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      },
      "get": {
        "description": "The project with its head document. A reviewer receives the document only when every source it references is available to them; otherwise it is withheld.",
        "operationId": "getStudioProject",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioProjectDetailDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get a Studio project",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      },
      "put": {
        "description": "Rename the project, set the shared space whose members may review it, archive it or bring it back, or choose a library item as its poster. Owner only.",
        "operationId": "updateStudioProject",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudioProjectUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioProjectDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update a Studio project",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/projects/{id}/comments": {
      "get": {
        "description": "Comments pinned to the timeline, oldest first.",
        "operationId": "getStudioProjectComments",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "skip",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 0,
              "maximum": 9007199254740991,
              "default": 0,
              "type": "integer"
            }
          },
          {
            "name": "take",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 200,
              "default": 50,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioCommentListResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List Studio review comments",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      },
      "post": {
        "description": "Owner and reviewers may comment. The time is an exact fraction of seconds. No lease is needed.",
        "operationId": "addStudioProjectComment",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudioCommentCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioCommentDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Add a Studio review comment",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/projects/{id}/comments/{commentId}": {
      "delete": {
        "description": "The author or the project owner may remove a comment.",
        "operationId": "removeStudioProjectComment",
        "parameters": [
          {
            "name": "commentId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Remove a Studio review comment",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      },
      "put": {
        "description": "The author edits the text; the author or the owner resolves or reopens it.",
        "operationId": "updateStudioProjectComment",
        "parameters": [
          {
            "name": "commentId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudioCommentUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioCommentDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update a Studio review comment",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/projects/{id}/duplicate": {
      "post": {
        "description": "Creates a new project of yours whose first version is this project as it is now. The copy is not shared for review. Owner only.",
        "operationId": "duplicateStudioProject",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudioProjectDuplicateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioProjectDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Duplicate a Studio project",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/projects/{id}/imports": {
      "get": {
        "description": "Every file kept with one of your projects, with its type, size and checksum.",
        "operationId": "getStudioProjectImports",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/StudioProjectImportDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List the files imported into a Studio project",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      },
      "post": {
        "description": "Keeps a recording, sound, image, short video, SVG or Lottie graphic, caption file (.srt or .vtt) or .cube LUT with the project rather than the library. The type is read from the bytes; an SVG with scripts is refused, external subresources of a graphic are counted, and a caption file or LUT must be well formed throughout. The same id and file again answers the stored import.",
        "operationId": "importStudioProjectFile",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/StudioProjectImportCreateDto"
              }
            }
          },
          "description": "A file to import into the project",
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioProjectImportDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Import a file into a Studio project",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/projects/{id}/imports/{importId}/file": {
      "get": {
        "description": "The bytes of a file kept with one of your projects, for the editor to play or show.",
        "operationId": "getStudioProjectImportFile",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Project id",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "importId",
            "required": true,
            "in": "path",
            "description": "Import id",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Read a file imported into a Studio project",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/projects/{id}/lease": {
      "post": {
        "description": "One editor instance writes at a time. The holder renews with the same call; a free or lapsed lease is taken; a live lease held elsewhere is refused with `409` unless `takeover` is set explicitly.",
        "operationId": "acquireStudioProjectLease",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudioProjectLeaseRequestDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioProjectLeaseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Acquire or renew the write lease",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/projects/{id}/lease/release": {
      "post": {
        "description": "Gives the lease back so another editor instance can take it without waiting for it to lapse.",
        "operationId": "releaseStudioProjectLease",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudioProjectLeaseRequestDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Release the write lease",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/projects/{id}/restore": {
      "post": {
        "description": "Appends a new revision with the content of an earlier one. History is never rewritten; the restore is itself a revision.",
        "operationId": "restoreStudioProjectRevision",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudioProjectRestoreDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioProjectSaveResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Restore a Studio project revision",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/projects/{id}/reverse-conform": {
      "post": {
        "description": "Owner-only local source reversal bound to a stored revision and the requesting editor lease.",
        "operationId": "enqueueStudioReverseConform",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudioReverseConformEnqueueDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioReverseConformQueuedDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Queue a Studio clip source reversal",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/projects/{id}/reverse-conform/apply": {
      "post": {
        "description": "Rechecks ownership, current source access, lease and the original revision before relinking the clip. Newer edits are never overwritten.",
        "operationId": "applyStudioReverseConform",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudioReverseConformApplyDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioProjectSaveResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Apply a completed Studio clip source reversal",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/projects/{id}/revisions": {
      "get": {
        "description": "Revisions newest first, without their documents.",
        "operationId": "getStudioProjectHistory",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "skip",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 0,
              "maximum": 9007199254740991,
              "default": 0,
              "type": "integer"
            }
          },
          {
            "name": "take",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 200,
              "default": 50,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioProjectHistoryResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List Studio project history",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      },
      "post": {
        "description": "Autosave. Stores the complete document as the next revision when `expectedRevision` is the head and the caller holds the lease. The same `requestKey` with the same document replays the earlier result; an unchanged document writes nothing.",
        "operationId": "saveStudioProjectRevision",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudioProjectSaveDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioProjectSaveResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Save a Studio project revision",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/projects/{id}/revisions/{revision}": {
      "get": {
        "description": "One historical revision with its document, under the same review rule as the head.",
        "operationId": "getStudioProjectRevision",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "revision",
            "required": true,
            "in": "path",
            "schema": {
              "minimum": 1,
              "maximum": 9007199254740991,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioProjectRevisionDetailDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get a Studio project revision",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/projects/{id}/revisions/{revision}/diff": {
      "get": {
        "description": "What changed between `against` and this revision, as graph paths and counts. No graph values are returned.",
        "operationId": "diffStudioProjectRevision",
        "parameters": [
          {
            "name": "against",
            "required": true,
            "in": "query",
            "description": "The earlier revision to compare with",
            "schema": {
              "minimum": 1,
              "maximum": 9007199254740991,
              "type": "integer"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "revision",
            "required": true,
            "in": "path",
            "schema": {
              "minimum": 1,
              "maximum": 9007199254740991,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioProjectDiffDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Compare two Studio project revisions",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/projects/{id}/trash/restore": {
      "post": {
        "description": "Brings a trashed project back to the shelf it was on. Owner only.",
        "operationId": "restoreStudioProjectFromTrash",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioProjectDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Restore a Studio project from the trash",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/studio/restored-versions/{id}": {
      "get": {
        "description": "An accepted restoration of one of your photos or videos as a Studio media bin entry: the media id a clip of it carries, its size and length, and whether it can be placed now. A discarded, expired or Locked one says so; someone else’s is not found.",
        "operationId": "getStudioRestoredVersion",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioRestoredVersionDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get a restored version for Studio",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "asset.edit.get"
      }
    },
    "/studio/workspace": {
      "get": {
        "description": "The editor layout you last saved, or nulls when you have none. Only ever your own.",
        "operationId": "getStudioWorkspace",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioWorkspaceDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get your Studio workspace layout",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      },
      "put": {
        "description": "Replaces your stored editor layout. The layout is stored as JSON and returned as the same value (key order and spacing are not kept), up to 256 KiB.",
        "operationId": "saveStudioWorkspace",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudioWorkspaceSaveDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudioWorkspaceDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Save your Studio workspace layout",
        "tags": [
          "Studio projects"
        ],
        "x-frameleaf-permission": "all"
      }
    },
    "/tags": {
      "get": {
        "description": "Retrieve a list of all tags.",
        "operationId": "getAllTags",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/TagResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve tags",
        "tags": [
          "Tags"
        ],
        "x-frameleaf-permission": "tag.read"
      },
      "post": {
        "description": "Create a new tag by providing a name and optional color.",
        "operationId": "createTag",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TagResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a tag",
        "tags": [
          "Tags"
        ],
        "x-frameleaf-permission": "tag.create"
      },
      "put": {
        "description": "Create or update multiple tags in a single request.",
        "operationId": "upsertTags",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagUpsertDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/TagResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Upsert tags",
        "tags": [
          "Tags"
        ],
        "x-frameleaf-permission": "tag.create"
      }
    },
    "/tags/assets": {
      "put": {
        "description": "Add multiple tags to multiple assets in a single request.",
        "operationId": "bulkTagAssets",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagBulkAssetsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TagBulkAssetsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Tag assets",
        "tags": [
          "Tags"
        ],
        "x-frameleaf-permission": "tag.asset"
      }
    },
    "/tags/statistics": {
      "get": {
        "description": "Count the Timeline items that carry each tag: exactly that tag, and that tag or any tag nested under it. Archived, Locked and hidden items are never counted, and tags the session may not see are left out.",
        "operationId": "getTagStatistics",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/TagStatisticsResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve tag statistics",
        "tags": [
          "Tags"
        ],
        "x-frameleaf-permission": "tag.read"
      }
    },
    "/tags/{id}": {
      "delete": {
        "description": "Delete a specific tag by its ID.",
        "operationId": "deleteTag",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a tag",
        "tags": [
          "Tags"
        ],
        "x-frameleaf-permission": "tag.delete"
      },
      "get": {
        "description": "Retrieve a specific tag by its ID.",
        "operationId": "getTagById",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TagResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve a tag",
        "tags": [
          "Tags"
        ],
        "x-frameleaf-permission": "tag.read"
      },
      "put": {
        "deprecated": true,
        "description": "Update an existing tag identified by its ID.",
        "operationId": "updateTag",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TagResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update a tag",
        "tags": [
          "Tags",
          "Deprecated"
        ],
        "x-frameleaf-permission": "tag.update"
      }
    },
    "/tags/{id}/assets": {
      "delete": {
        "description": "Remove a tag from all the specified assets.",
        "operationId": "untagAssets",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkIdsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/BulkIdResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Untag assets",
        "tags": [
          "Tags"
        ],
        "x-frameleaf-permission": "tag.asset"
      },
      "put": {
        "description": "Add a tag to all the specified assets.",
        "operationId": "tagAssets",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkIdsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/BulkIdResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Tag assets",
        "tags": [
          "Tags"
        ],
        "x-frameleaf-permission": "tag.asset"
      }
    },
    "/takeout": {
      "get": {
        "operationId": "listTakeoutImports",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/TakeoutResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List Google Photos imports",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      },
      "post": {
        "description": "Creates an import to stage Takeout archives into. Administrators may instead name a folder inside one of the permitted import locations.",
        "operationId": "createTakeoutImport",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TakeoutCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TakeoutResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Start a Google Photos import",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/takeout/roots": {
      "get": {
        "operationId": "getTakeoutRoots",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TakeoutRootsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List the permitted import locations",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-admin-only": true,
        "x-frameleaf-permission": "all"
      }
    },
    "/takeout/{id}": {
      "delete": {
        "description": "Removes the import and its staged copies. Everything it brought into the library stays there.",
        "operationId": "deleteTakeoutImport",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a Google Photos import",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      },
      "get": {
        "operationId": "getTakeoutImport",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TakeoutResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get a Google Photos import",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/takeout/{id}/archives": {
      "post": {
        "operationId": "createTakeoutArchive",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TakeoutArchiveCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TakeoutSourceResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Stage a Takeout archive",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/takeout/{id}/archives/{archiveId}": {
      "delete": {
        "operationId": "deleteTakeoutArchive",
        "parameters": [
          {
            "name": "archiveId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Remove a staged Takeout archive",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/takeout/{id}/archives/{archiveId}/chunks": {
      "put": {
        "description": "Appends up to 8 MiB at the given byte offset. Repeating a part already staged is harmless.",
        "operationId": "uploadTakeoutArchiveChunk",
        "parameters": [
          {
            "name": "archiveId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          },
          {
            "name": "offset",
            "required": true,
            "in": "query",
            "description": "Byte offset of this chunk",
            "schema": {
              "minimum": 0,
              "maximum": 1099511627776,
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/octet-stream": {
              "schema": {
                "format": "binary",
                "type": "string"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TakeoutSourceResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Upload part of a Takeout archive",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/takeout/{id}/archives/{archiveId}/verify": {
      "post": {
        "description": "Compares a range already uploaded with the file the browser is about to resume from.",
        "operationId": "verifyTakeoutArchiveChunk",
        "parameters": [
          {
            "name": "archiveId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TakeoutVerifyChunkDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Check a staged part of a Takeout archive",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/takeout/{id}/control": {
      "post": {
        "operationId": "controlTakeoutImport",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TakeoutControlDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TakeoutResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Pause, resume or cancel a Google Photos import",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/takeout/{id}/import": {
      "post": {
        "description": "Queues the import as a background job with these choices. Items already in the library are matched, not copied again, and keep their album memberships.",
        "operationId": "startTakeoutImport",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TakeoutOptionsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TakeoutResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Import the reviewed items",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/takeout/{id}/items": {
      "get": {
        "operationId": "getTakeoutItems",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Items to return",
            "schema": {
              "minimum": 1,
              "maximum": 200,
              "default": 100,
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Items to skip",
            "schema": {
              "minimum": 0,
              "maximum": 9007199254740991,
              "default": 0,
              "type": "integer"
            }
          },
          {
            "name": "state",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/TakeoutItemState"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TakeoutItemsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List the items of a Google Photos import",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/takeout/{id}/items/{itemId}": {
      "put": {
        "operationId": "resolveTakeoutItem",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          },
          {
            "name": "itemId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TakeoutResolveDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TakeoutResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Choose metadata for an item, or leave it out",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/takeout/{id}/live-photos": {
      "get": {
        "operationId": "getTakeoutPairs",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Pairs to return",
            "schema": {
              "minimum": 1,
              "maximum": 200,
              "default": 100,
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Pairs to skip",
            "schema": {
              "minimum": 0,
              "maximum": 9007199254740991,
              "default": 0,
              "type": "integer"
            }
          },
          {
            "name": "state",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/TakeoutPairState"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TakeoutPairsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List possible Live Photos in a Google Photos import",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      },
      "put": {
        "operationId": "decideTakeoutPair",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TakeoutPairDecisionDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TakeoutPairsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Link or separate a possible Live Photo",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/takeout/{id}/scan": {
      "post": {
        "description": "Queues the scan of the staged sources as a background job that continues after the browser closes.",
        "operationId": "scanTakeoutImport",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TakeoutResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Scan a Google Photos import",
        "tags": [
          "Assets"
        ],
        "x-frameleaf-permission": "asset.upload"
      }
    },
    "/timeline/bucket": {
      "get": {
        "description": "Retrieve a string of all asset ids in a given time bucket.",
        "operationId": "getTimeBucket",
        "parameters": [
          {
            "name": "albumId",
            "required": false,
            "in": "query",
            "description": "Filter assets belonging to a specific album",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "assetType",
            "required": false,
            "in": "query",
            "description": "Filter assets by media type",
            "schema": {
              "$ref": "#/components/schemas/AssetTypeEnum"
            }
          },
          {
            "name": "bbox",
            "required": false,
            "in": "query",
            "description": "Bounding box coordinates as west,south,east,north (WGS84)",
            "schema": {
              "example": "11.075683,49.416711,11.117589,49.454875",
              "type": "string"
            }
          },
          {
            "name": "dateType",
            "required": false,
            "in": "query",
            "description": "Date source for timeline bucket grouping. Defaults to taken date.",
            "schema": {
              "$ref": "#/components/schemas/TimeBucketDateType"
            }
          },
          {
            "name": "isFavorite",
            "required": false,
            "in": "query",
            "description": "Filter by favorite status (true for favorites only, false for non-favorites only)",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isTrashed",
            "required": false,
            "in": "query",
            "description": "Filter by trash status (true for trashed assets only, false for non-trashed only)",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lockReason",
            "required": false,
            "in": "query",
            "description": "With visibility LOCKED only: return only assets locked for this reason. Requires an elevated session.",
            "schema": {
              "$ref": "#/components/schemas/AssetLockReason"
            }
          },
          {
            "name": "order",
            "required": false,
            "in": "query",
            "description": "Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)",
            "schema": {
              "$ref": "#/components/schemas/AssetOrder"
            }
          },
          {
            "name": "orderBy",
            "required": false,
            "in": "query",
            "description": "Date to group and order assets by (takenAt for date taken, createdAt for date added to Frameleaf)",
            "schema": {
              "$ref": "#/components/schemas/AssetOrderBy"
            }
          },
          {
            "name": "personId",
            "required": false,
            "in": "query",
            "description": "Filter assets containing a specific person (face recognition)",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "petId",
            "required": false,
            "in": "query",
            "description": "Filter assets in which the caller confirmed one of their own pets",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "suppressedOnly",
            "required": false,
            "in": "query",
            "description": "Return only suppressed content. Requires an elevated session.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "tagId",
            "required": false,
            "in": "query",
            "description": "Filter assets with a specific tag",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "timeBucket",
            "required": true,
            "in": "query",
            "description": "Time bucket identifier in YYYY-MM-DDT00:00:00.000Z format",
            "schema": {
              "example": "2024-01-01T00:00:00.000Z",
              "type": "string"
            }
          },
          {
            "name": "userId",
            "required": false,
            "in": "query",
            "description": "Filter assets by specific user ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "visibility",
            "required": false,
            "in": "query",
            "description": "Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)",
            "schema": {
              "$ref": "#/components/schemas/AssetVisibility"
            }
          },
          {
            "name": "withCoordinates",
            "required": false,
            "in": "query",
            "description": "Include location data in the response",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "withStacked",
            "required": false,
            "in": "query",
            "description": "Include stacked assets in the response. When true, only primary assets from stacks are returned.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeBucketAssetResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get time bucket",
        "tags": [
          "Timeline"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/timeline/buckets": {
      "get": {
        "description": "Retrieve a list of all minimal time buckets.",
        "operationId": "getTimeBuckets",
        "parameters": [
          {
            "name": "albumId",
            "required": false,
            "in": "query",
            "description": "Filter assets belonging to a specific album",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "assetType",
            "required": false,
            "in": "query",
            "description": "Filter assets by media type",
            "schema": {
              "$ref": "#/components/schemas/AssetTypeEnum"
            }
          },
          {
            "name": "bbox",
            "required": false,
            "in": "query",
            "description": "Bounding box coordinates as west,south,east,north (WGS84)",
            "schema": {
              "example": "11.075683,49.416711,11.117589,49.454875",
              "type": "string"
            }
          },
          {
            "name": "dateType",
            "required": false,
            "in": "query",
            "description": "Date source for timeline bucket grouping. Defaults to taken date.",
            "schema": {
              "$ref": "#/components/schemas/TimeBucketDateType"
            }
          },
          {
            "name": "isFavorite",
            "required": false,
            "in": "query",
            "description": "Filter by favorite status (true for favorites only, false for non-favorites only)",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isTrashed",
            "required": false,
            "in": "query",
            "description": "Filter by trash status (true for trashed assets only, false for non-trashed only)",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lockReason",
            "required": false,
            "in": "query",
            "description": "With visibility LOCKED only: return only assets locked for this reason. Requires an elevated session.",
            "schema": {
              "$ref": "#/components/schemas/AssetLockReason"
            }
          },
          {
            "name": "order",
            "required": false,
            "in": "query",
            "description": "Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)",
            "schema": {
              "$ref": "#/components/schemas/AssetOrder"
            }
          },
          {
            "name": "orderBy",
            "required": false,
            "in": "query",
            "description": "Date to group and order assets by (takenAt for date taken, createdAt for date added to Frameleaf)",
            "schema": {
              "$ref": "#/components/schemas/AssetOrderBy"
            }
          },
          {
            "name": "personId",
            "required": false,
            "in": "query",
            "description": "Filter assets containing a specific person (face recognition)",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "petId",
            "required": false,
            "in": "query",
            "description": "Filter assets in which the caller confirmed one of their own pets",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "suppressedOnly",
            "required": false,
            "in": "query",
            "description": "Return only suppressed content. Requires an elevated session.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "tagId",
            "required": false,
            "in": "query",
            "description": "Filter assets with a specific tag",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "userId",
            "required": false,
            "in": "query",
            "description": "Filter assets by specific user ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "visibility",
            "required": false,
            "in": "query",
            "description": "Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)",
            "schema": {
              "$ref": "#/components/schemas/AssetVisibility"
            }
          },
          {
            "name": "withCoordinates",
            "required": false,
            "in": "query",
            "description": "Include location data in the response",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "withStacked",
            "required": false,
            "in": "query",
            "description": "Include stacked assets in the response. When true, only primary assets from stacks are returned.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/TimeBucketsResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get time buckets",
        "tags": [
          "Timeline"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/timeline/highlights": {
      "get": {
        "description": "Curated Years and Months cards for the same filters as the time buckets: per year or month the count, a key photo (highest Best Photos score, then rating, then most recent), highlights for months and the top three places.",
        "operationId": "getTimelineHighlights",
        "parameters": [
          {
            "name": "albumId",
            "required": false,
            "in": "query",
            "description": "Filter assets belonging to a specific album",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "assetType",
            "required": false,
            "in": "query",
            "description": "Filter assets by media type",
            "schema": {
              "$ref": "#/components/schemas/AssetTypeEnum"
            }
          },
          {
            "name": "bbox",
            "required": false,
            "in": "query",
            "description": "Bounding box coordinates as west,south,east,north (WGS84)",
            "schema": {
              "example": "11.075683,49.416711,11.117589,49.454875",
              "type": "string"
            }
          },
          {
            "name": "dateType",
            "required": false,
            "in": "query",
            "description": "Date source for timeline bucket grouping. Defaults to taken date.",
            "schema": {
              "$ref": "#/components/schemas/TimeBucketDateType"
            }
          },
          {
            "name": "grouping",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/TimelineHighlightGrouping"
            }
          },
          {
            "name": "highlightCount",
            "required": false,
            "in": "query",
            "description": "Highlights besides the key photo for each month card (default 4). Year cards carry none",
            "schema": {
              "minimum": 0,
              "maximum": 12,
              "type": "integer"
            }
          },
          {
            "name": "isFavorite",
            "required": false,
            "in": "query",
            "description": "Filter by favorite status (true for favorites only, false for non-favorites only)",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isTrashed",
            "required": false,
            "in": "query",
            "description": "Filter by trash status (true for trashed assets only, false for non-trashed only)",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lockReason",
            "required": false,
            "in": "query",
            "description": "With visibility LOCKED only: return only assets locked for this reason. Requires an elevated session.",
            "schema": {
              "$ref": "#/components/schemas/AssetLockReason"
            }
          },
          {
            "name": "order",
            "required": false,
            "in": "query",
            "description": "Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)",
            "schema": {
              "$ref": "#/components/schemas/AssetOrder"
            }
          },
          {
            "name": "orderBy",
            "required": false,
            "in": "query",
            "description": "Date to group and order assets by (takenAt for date taken, createdAt for date added to Frameleaf)",
            "schema": {
              "$ref": "#/components/schemas/AssetOrderBy"
            }
          },
          {
            "name": "personId",
            "required": false,
            "in": "query",
            "description": "Filter assets containing a specific person (face recognition)",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "petId",
            "required": false,
            "in": "query",
            "description": "Filter assets in which the caller confirmed one of their own pets",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "suppressedOnly",
            "required": false,
            "in": "query",
            "description": "Return only suppressed content. Requires an elevated session.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "tagId",
            "required": false,
            "in": "query",
            "description": "Filter assets with a specific tag",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "userId",
            "required": false,
            "in": "query",
            "description": "Filter assets by specific user ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "visibility",
            "required": false,
            "in": "query",
            "description": "Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)",
            "schema": {
              "$ref": "#/components/schemas/AssetVisibility"
            }
          },
          {
            "name": "withCoordinates",
            "required": false,
            "in": "query",
            "description": "Include location data in the response",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "withStacked",
            "required": false,
            "in": "query",
            "description": "Include stacked assets in the response. When true, only primary assets from stacks are returned.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/TimelineHighlightResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get timeline highlights",
        "tags": [
          "Timeline"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/timeline/ordered": {
      "get": {
        "description": "One page of the assets the time buckets would show for the same filters, ordered by file name or by rating instead of by date, in the time bucket response shape.",
        "operationId": "getTimelineOrdered",
        "parameters": [
          {
            "name": "albumId",
            "required": false,
            "in": "query",
            "description": "Filter assets belonging to a specific album",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "assetType",
            "required": false,
            "in": "query",
            "description": "Filter assets by media type",
            "schema": {
              "$ref": "#/components/schemas/AssetTypeEnum"
            }
          },
          {
            "name": "bbox",
            "required": false,
            "in": "query",
            "description": "Bounding box coordinates as west,south,east,north (WGS84)",
            "schema": {
              "example": "11.075683,49.416711,11.117589,49.454875",
              "type": "string"
            }
          },
          {
            "name": "dateType",
            "required": false,
            "in": "query",
            "description": "Date source for timeline bucket grouping. Defaults to taken date.",
            "schema": {
              "$ref": "#/components/schemas/TimeBucketDateType"
            }
          },
          {
            "name": "isFavorite",
            "required": false,
            "in": "query",
            "description": "Filter by favorite status (true for favorites only, false for non-favorites only)",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "isTrashed",
            "required": false,
            "in": "query",
            "description": "Filter by trash status (true for trashed assets only, false for non-trashed only)",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "key",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lockReason",
            "required": false,
            "in": "query",
            "description": "With visibility LOCKED only: return only assets locked for this reason. Requires an elevated session.",
            "schema": {
              "$ref": "#/components/schemas/AssetLockReason"
            }
          },
          {
            "name": "order",
            "required": false,
            "in": "query",
            "description": "Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)",
            "schema": {
              "$ref": "#/components/schemas/AssetOrder"
            }
          },
          {
            "name": "orderBy",
            "required": false,
            "in": "query",
            "description": "Date to group and order assets by (takenAt for date taken, createdAt for date added to Frameleaf)",
            "schema": {
              "$ref": "#/components/schemas/AssetOrderBy"
            }
          },
          {
            "name": "personId",
            "required": false,
            "in": "query",
            "description": "Filter assets containing a specific person (face recognition)",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "petId",
            "required": false,
            "in": "query",
            "description": "Filter assets in which the caller confirmed one of their own pets",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "skip",
            "required": false,
            "in": "query",
            "description": "Items to skip",
            "schema": {
              "minimum": 0,
              "maximum": 9007199254740991,
              "default": 0,
              "type": "integer"
            }
          },
          {
            "name": "slug",
            "required": false,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "required": true,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/TimelineOrderedSort"
            }
          },
          {
            "name": "suppressedOnly",
            "required": false,
            "in": "query",
            "description": "Return only suppressed content. Requires an elevated session.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "tagId",
            "required": false,
            "in": "query",
            "description": "Filter assets with a specific tag",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "take",
            "required": false,
            "in": "query",
            "description": "Items to return (at most 1000)",
            "schema": {
              "minimum": 1,
              "maximum": 1000,
              "default": 500,
              "type": "integer"
            }
          },
          {
            "name": "userId",
            "required": false,
            "in": "query",
            "description": "Filter assets by specific user ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "visibility",
            "required": false,
            "in": "query",
            "description": "Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)",
            "schema": {
              "$ref": "#/components/schemas/AssetVisibility"
            }
          },
          {
            "name": "withCoordinates",
            "required": false,
            "in": "query",
            "description": "Include location data in the response",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "withStacked",
            "required": false,
            "in": "query",
            "description": "Include stacked assets in the response. When true, only primary assets from stacks are returned.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeBucketAssetResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get the timeline in a flat order",
        "tags": [
          "Timeline"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/trash/activity": {
      "get": {
        "description": "Your own history of moves to the trash and their undos made from a utility such as Large files, newest first, kept for a year. An item is named only while this session may still see it.",
        "operationId": "getUtilityActivity",
        "parameters": [
          {
            "name": "tool",
            "required": true,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/UtilityActivityTool"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UtilityActivityResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get utility activity",
        "tags": [
          "Trash"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/trash/apply": {
      "post": {
        "description": "Applies an action to exactly the reviewed set. The set is resolved again with the same ownership, Locked and privacy rules; if it differs from the review in any way the request fails with 409 and nothing changes.",
        "operationId": "applyTrashReview",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TrashApplyDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrashResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Apply a reviewed trash change",
        "tags": [
          "Trash"
        ],
        "x-frameleaf-permission": "asset.delete"
      }
    },
    "/trash/empty": {
      "post": {
        "description": "Permanently delete all items in the trash.",
        "operationId": "emptyTrash",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrashResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Empty trash",
        "tags": [
          "Trash"
        ],
        "x-frameleaf-permission": "asset.delete"
      }
    },
    "/trash/items": {
      "get": {
        "description": "One page of your own trash, filtered by file name and media type and ordered by deletion time, size or name. Locked media is listed only in an unlocked session.",
        "operationId": "getTrashItems",
        "parameters": [
          {
            "name": "page",
            "required": false,
            "in": "query",
            "description": "Page number, from 1",
            "schema": {
              "minimum": 1,
              "maximum": 9007199254740991,
              "default": 1,
              "type": "integer"
            }
          },
          {
            "name": "query",
            "required": false,
            "in": "query",
            "description": "Words that must all appear in the file name",
            "schema": {
              "maxLength": 255,
              "type": "string"
            }
          },
          {
            "name": "size",
            "required": false,
            "in": "query",
            "description": "Items per page",
            "schema": {
              "minimum": 1,
              "maximum": 1000,
              "default": 200,
              "type": "integer"
            }
          },
          {
            "name": "sort",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/TrashItemSort"
            }
          },
          {
            "name": "type",
            "required": false,
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/AssetTypeEnum"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrashItemsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List trash items",
        "tags": [
          "Trash"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/trash/restore": {
      "post": {
        "description": "Restore all items in the trash.",
        "operationId": "restoreTrash",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrashResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Restore trash",
        "tags": [
          "Trash"
        ],
        "x-frameleaf-permission": "asset.delete"
      }
    },
    "/trash/restore/assets": {
      "post": {
        "description": "Restore specific assets from the trash.",
        "operationId": "restoreAssets",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkIdsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrashResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Restore assets",
        "tags": [
          "Trash"
        ],
        "x-frameleaf-permission": "asset.delete"
      }
    },
    "/trash/review": {
      "post": {
        "description": "Resolves exactly which items an action would change (move to trash, restore, restore all, delete or empty) and returns their count, size, shared originals and a token that fingerprints the set. Nothing is changed.",
        "operationId": "reviewTrash",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TrashReviewDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrashReviewResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Review a trash change",
        "tags": [
          "Trash"
        ],
        "x-frameleaf-permission": "asset.delete"
      }
    },
    "/trash/summary": {
      "get": {
        "description": "Counts for your own trash as this session may see it: items, the combined size of their originals, and items still being removed from storage. Locked media counts only in an unlocked session.",
        "operationId": "getTrashSummary",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrashSummaryResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get trash summary",
        "tags": [
          "Trash"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/users": {
      "get": {
        "description": "Retrieve a list of all users on the server.",
        "operationId": "searchUsers",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/UserResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get all users",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "user.read"
      }
    },
    "/users/me/backup-devices": {
      "get": {
        "operationId": "listBackupDevices",
        "parameters": [
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 200,
              "default": 100,
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 0,
              "maximum": 1000000,
              "default": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BackupDeviceListDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List own backup devices",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "user.read"
      },
      "post": {
        "description": "Stable deviceKey scoped to the owner. Success time and pending count are device-reported, never checksum verification. Removing a device preserves assets and reconciliation history.",
        "operationId": "registerBackupDevice",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BackupDeviceWriteDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BackupDeviceDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Register or report an own backup device",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "user.update"
      }
    },
    "/users/me/backup-devices/{id}": {
      "delete": {
        "operationId": "removeBackupDevice",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Remove an own backup device without deleting assets",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "user.update"
      }
    },
    "/users/me/backup-devices/{id}/reconciliations": {
      "get": {
        "description": "Requires elevated unfiltered session; checkedAt identifies actual inventory snapshot. Includes incomplete runs explicitly; admin metadata access never grants foreign hash access.",
        "operationId": "listBackupReconciliations",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 1,
              "maximum": 200,
              "default": 100,
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "schema": {
              "minimum": 0,
              "maximum": 1000000,
              "default": 0,
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReconciliationHistoryDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List own device reconciliation history",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "asset.read"
      },
      "post": {
        "description": "Requires a current elevated session and no active hidden-content filter.256 indexed bucket digests of sorted unique raw SHA256 bytes, maximum2000 hashes per bucket. Differing buckets require complete hash lists. Snapshot database inventory excludes offline/last-checked-missing originals; not a fresh filesystem check.",
        "operationId": "startBackupReconciliation",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReconciliationStartDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReconciliationResultDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Start own device inventory reconciliation",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/users/me/backup-devices/{id}/reconciliations/{runId}/buckets": {
      "post": {
        "description": "Up to2000 distinct SHA256 hashes matching original count/digest and first-byte bucket. Server extras never count as device missing. Changed server inventory refuses continuation; start a new run. Repeated validated bucket requests do not double-count; a concurrent snapshot conflict returns409 and may be retried. No completed audit until every differing bucket is validated.",
        "operationId": "reconcileBackupBucket",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          },
          {
            "name": "runId",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReconciliationBucketDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReconciliationResultDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Reconcile one complete differing bucket",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "asset.read"
      }
    },
    "/users/me/calendar-heatmap": {
      "get": {
        "description": "Retrieve activity counts for a specified period, in a calendar heatmap format.",
        "operationId": "getMyCalendarHeatmap",
        "parameters": [
          {
            "name": "from",
            "required": false,
            "in": "query",
            "description": "Start date in UTC",
            "schema": {
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
              "example": "2024-01-01",
              "type": "string"
            }
          },
          {
            "name": "to",
            "required": false,
            "in": "query",
            "description": "End date in UTC",
            "schema": {
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
              "example": "2024-01-01",
              "type": "string"
            }
          },
          {
            "name": "type",
            "required": false,
            "in": "query",
            "schema": {
              "default": "Upload",
              "$ref": "#/components/schemas/CalendarHeatmapType"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CalendarHeatmapResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve calendar heatmap activity",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "user.read"
      }
    },
    "/users/me/onboarding": {
      "delete": {
        "description": "Delete the onboarding status of the current user.",
        "operationId": "deleteUserOnboarding",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete user onboarding",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "userOnboarding.delete"
      },
      "get": {
        "description": "Retrieve the onboarding status of the current user.",
        "operationId": "getUserOnboarding",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OnboardingResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve user onboarding",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "userOnboarding.read"
      },
      "put": {
        "description": "Update the onboarding status of the current user.",
        "operationId": "setUserOnboarding",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OnboardingDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OnboardingResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update user onboarding",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "userOnboarding.update"
      }
    },
    "/users/me/pins": {
      "get": {
        "description": "Complete ordered snapshot of current access-filtered titles, counts and covers. Unavailable pins disclose only their opaque pin ID and kind. Requires a user session.",
        "operationId": "getMyPinnedCollections",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PinnedCollectionsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get my pinned collections",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "userPreference.read"
      },
      "put": {
        "description": "Add, remove or reorder by replacing the complete ordered list against expectedRevision. Stale writes return 409. Retain unavailable pins using their opaque ID, kind and null targetId. Requires a user session.",
        "operationId": "setMyPinnedCollections",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PinnedCollectionsUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PinnedCollectionsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Replace my pinned collections",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "userPreference.update"
      }
    },
    "/users/me/preferences": {
      "get": {
        "description": "Retrieve the preferences for the current user.",
        "operationId": "getMyPreferences",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserPreferencesResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get my preferences",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "userPreference.read"
      },
      "put": {
        "deprecated": true,
        "description": "Update the preferences of the current user.",
        "operationId": "updateMyPreferences",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserPreferencesUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserPreferencesResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update my preferences",
        "tags": [
          "Users",
          "Deprecated"
        ],
        "x-frameleaf-permission": "userPreference.update"
      }
    },
    "/users/me/preferences/history": {
      "get": {
        "description": "The newest changes to the current user’s own preferences, with the device that saved each. Locked-content rules appear only as changed.",
        "operationId": "getMyPreferenceHistory",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserPreferenceHistoryResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Get my preference history",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "userPreference.read"
      }
    },
    "/users/profile-image": {
      "delete": {
        "description": "Delete the profile image of the current user.",
        "operationId": "deleteProfileImage",
        "parameters": [],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete user profile image",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "userProfileImage.delete"
      },
      "post": {
        "description": "Upload and set a new profile image for the current user.",
        "operationId": "createProfileImage",
        "parameters": [],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CreateProfileImageDto"
              }
            }
          },
          "description": "A new avatar for the user",
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateProfileImageResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create user profile image",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "userProfileImage.update"
      }
    },
    "/users/{id}": {
      "get": {
        "description": "Retrieve a specific user by their ID.",
        "operationId": "getUser",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve a user",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "user.read"
      }
    },
    "/users/{id}/profile-image": {
      "get": {
        "description": "Retrieve the profile image file for a user.",
        "operationId": "getProfileImage",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve user profile image",
        "tags": [
          "Users"
        ],
        "x-frameleaf-permission": "userProfileImage.read"
      }
    },
    "/view/folder": {
      "get": {
        "description": "Retrieve assets that are children of a specific folder.",
        "operationId": "getAssetsByOriginalPath",
        "parameters": [
          {
            "name": "path",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AssetResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve assets by original path",
        "tags": [
          "Views"
        ],
        "x-frameleaf-permission": "folder.read"
      }
    },
    "/view/folder/summary": {
      "get": {
        "description": "Retrieve, for each folder, how many originals it holds directly and their size in bytes, counting only the Timeline items the folder views list.",
        "operationId": "getFolderSummary",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/FolderSummaryResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve folder summaries",
        "tags": [
          "Views"
        ],
        "x-frameleaf-permission": "folder.read"
      }
    },
    "/view/folder/unique-paths": {
      "get": {
        "description": "Retrieve a list of unique folder paths from asset original paths.",
        "operationId": "getUniqueOriginalPaths",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve unique paths",
        "tags": [
          "Views"
        ],
        "x-frameleaf-permission": "folder.read"
      }
    },
    "/workflows": {
      "get": {
        "description": "Retrieve a list of workflows available to the authenticated user.",
        "operationId": "searchWorkflows",
        "parameters": [
          {
            "name": "description",
            "required": false,
            "in": "query",
            "description": "Workflow description",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "enabled",
            "required": false,
            "in": "query",
            "description": "Workflow enabled",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "id",
            "required": false,
            "in": "query",
            "description": "Workflow ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "logging",
            "required": false,
            "in": "query",
            "description": "Workflow logs run results",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "name",
            "required": false,
            "in": "query",
            "description": "Workflow name",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trigger",
            "required": false,
            "in": "query",
            "description": "Workflow trigger type",
            "schema": {
              "$ref": "#/components/schemas/WorkflowTrigger"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/WorkflowResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List all workflows",
        "tags": [
          "Workflows"
        ],
        "x-frameleaf-permission": "workflow.read"
      },
      "post": {
        "description": "Create a new workflow, the workflow can also be created with empty filters and actions.",
        "operationId": "createWorkflow",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowCreateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a workflow",
        "tags": [
          "Workflows"
        ],
        "x-frameleaf-permission": "workflow.create"
      }
    },
    "/workflows/triggers": {
      "get": {
        "description": "Retrieve a list of all available workflow triggers.",
        "operationId": "getWorkflowTriggers",
        "parameters": [],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/WorkflowTriggerResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "List all workflow triggers",
        "tags": [
          "Workflows"
        ],
        "x-frameleaf-permission": false
      }
    },
    "/workflows/{id}": {
      "delete": {
        "description": "Delete a workflow by its ID.",
        "operationId": "deleteWorkflow",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Delete a workflow",
        "tags": [
          "Workflows"
        ],
        "x-frameleaf-permission": "workflow.delete"
      },
      "get": {
        "description": "Retrieve information about a specific workflow by its ID.",
        "operationId": "getWorkflow",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve a workflow",
        "tags": [
          "Workflows"
        ],
        "x-frameleaf-permission": "workflow.read"
      },
      "put": {
        "deprecated": true,
        "description": "Update the information of a specific workflow by its ID. This endpoint can be used to update the workflow name, description, trigger type, filters and actions order, etc.",
        "operationId": "updateWorkflow",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowUpdateDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Update a workflow",
        "tags": [
          "Workflows",
          "Deprecated"
        ],
        "x-frameleaf-permission": "workflow.update"
      }
    },
    "/workflows/{id}/logs": {
      "get": {
        "description": "Retrieve logs of a workflows runs by ID",
        "operationId": "getWorkflowLogs",
        "parameters": [
          {
            "name": "before",
            "required": false,
            "in": "query",
            "description": "Filter by runs before a date/time",
            "schema": {
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
              "example": "2024-01-01T00:00:00.000Z",
              "type": "string"
            }
          },
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Maximum number of logs",
            "schema": {
              "maximum": 200,
              "exclusiveMinimum": true,
              "default": 50,
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "result",
            "required": false,
            "in": "query",
            "description": "Filter by run result",
            "schema": {
              "$ref": "#/components/schemas/WorkflowResult"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/WorkflowLogEntryDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve workflow logs",
        "tags": [
          "Workflows"
        ],
        "x-frameleaf-permission": "workflow.logs"
      }
    },
    "/workflows/{id}/runs/{runId}/retry": {
      "post": {
        "description": "Run a logged workflow run again, as its next attempt, for the photo or video that started it. The workflow must be enabled and able to run.",
        "operationId": "retryWorkflowRun",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Workflow ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          },
          {
            "name": "runId",
            "required": true,
            "in": "path",
            "description": "Run ID",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retry a workflow run",
        "tags": [
          "Workflows"
        ],
        "x-frameleaf-permission": "workflow.update"
      }
    },
    "/workflows/{id}/share": {
      "get": {
        "description": "Retrieve a workflow details without ids, default values, etc.",
        "operationId": "getWorkflowForShare",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowShareResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Retrieve a workflow",
        "tags": [
          "Workflows"
        ],
        "x-frameleaf-permission": "workflow.read"
      }
    }
  },
  "components": {
    "securitySchemes": {
      "api_key": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key"
      }
    },
    "schemas": {
      "ActivityResponseDto": {
        "properties": {
          "assetId": {
            "description": "Asset ID (if activity is for an asset)",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "comment": {
            "description": "Comment text (for comment activities)",
            "nullable": true,
            "type": "string"
          },
          "createdAt": {
            "description": "Creation date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "id": {
            "description": "Activity ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/ReactionType"
          },
          "user": {
            "$ref": "#/components/schemas/UserResponseDto"
          }
        },
        "required": [
          "assetId",
          "createdAt",
          "id",
          "type",
          "user"
        ],
        "type": "object"
      },
      "UserResponseDto": {
        "properties": {
          "avatarColor": {
            "$ref": "#/components/schemas/UserAvatarColor"
          },
          "email": {
            "description": "User email",
            "format": "email",
            "pattern": "^[\\p{L}\\p{M}\\p{N}.!#$%&'*+/=?^_`{|}~-]+@[\\p{L}\\p{N}](?:[\\p{L}\\p{M}\\p{N}-]{0,61}[\\p{L}\\p{M}\\p{N}])?(?:\\.[\\p{L}\\p{N}](?:[\\p{L}\\p{M}\\p{N}-]{0,61}[\\p{L}\\p{M}\\p{N}])?)*$",
            "type": "string"
          },
          "id": {
            "description": "User ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "description": "User name",
            "type": "string"
          },
          "profileChangedAt": {
            "description": "Profile change date",
            "format": "date-time",
            "type": "string"
          },
          "profileImagePath": {
            "description": "Profile image path",
            "type": "string"
          }
        },
        "required": [
          "avatarColor",
          "email",
          "id",
          "name",
          "profileChangedAt",
          "profileImagePath"
        ],
        "type": "object"
      },
      "UserAvatarColor": {
        "description": "User avatar color",
        "enum": [
          "primary",
          "pink",
          "red",
          "yellow",
          "blue",
          "green",
          "purple",
          "orange",
          "gray",
          "amber"
        ],
        "type": "string"
      },
      "ReactionType": {
        "description": "Reaction type",
        "enum": [
          "comment",
          "like"
        ],
        "type": "string"
      },
      "ReactionLevel": {
        "description": "Reaction level",
        "enum": [
          "album",
          "asset"
        ],
        "type": "string"
      },
      "ActivityCreateDto": {
        "description": "Activity create",
        "properties": {
          "albumId": {
            "description": "Album ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "assetId": {
            "description": "Asset ID (if activity is for an asset)",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "comment": {
            "description": "Comment text (required if type is comment)",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/ReactionType"
          }
        },
        "required": [
          "albumId",
          "type"
        ],
        "type": "object"
      },
      "ActivityStatisticsResponseDto": {
        "properties": {
          "comments": {
            "description": "Number of comments",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "likes": {
            "description": "Number of likes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "comments",
          "likes"
        ],
        "type": "object"
      },
      "BackupDeviceListDto": {
        "properties": {
          "devices": {
            "items": {
              "$ref": "#/components/schemas/BackupDeviceDto"
            },
            "type": "array"
          },
          "nextOffset": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "devices",
          "nextOffset"
        ],
        "type": "object"
      },
      "BackupDeviceDto": {
        "properties": {
          "appVersion": {
            "type": "string"
          },
          "deviceKey": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "lastSuccessfulBackupAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "model": {
            "type": "string"
          },
          "ownerId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "pendingCount": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "platform": {
            "type": "string"
          },
          "quietForDays": {
            "description": "Elapsed whole days since reported success; null if never reported",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "reportedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "appVersion",
          "deviceKey",
          "displayName",
          "id",
          "lastSuccessfulBackupAt",
          "model",
          "ownerId",
          "pendingCount",
          "platform",
          "quietForDays",
          "reportedAt"
        ],
        "type": "object"
      },
      "DatabaseBackupDeleteDto": {
        "properties": {
          "backups": {
            "description": "Backup filenames to delete",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "backups"
        ],
        "type": "object"
      },
      "DatabaseBackupListResponseDto": {
        "properties": {
          "backups": {
            "description": "List of backups",
            "items": {
              "$ref": "#/components/schemas/DatabaseBackupDto"
            },
            "type": "array"
          }
        },
        "required": [
          "backups"
        ],
        "type": "object"
      },
      "DatabaseBackupDto": {
        "properties": {
          "filename": {
            "description": "Backup filename",
            "type": "string"
          },
          "filesize": {
            "description": "Backup file size",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "timezone": {
            "description": "Backup timezone",
            "type": "string"
          }
        },
        "required": [
          "filename",
          "filesize",
          "timezone"
        ],
        "type": "object"
      },
      "BackupRestoreVerificationResponseDto": {
        "properties": {
          "dueAt": {
            "description": "When the next test is due; null when a part has never been proved",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "intervalDays": {
            "description": "How often a restore test is due",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "metadataVerifiedAt": {
            "description": "When restoring the database was last proved",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "originalsVerifiedAt": {
            "description": "When restoring the original files was last proved",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "overdue": {
            "description": "Whether a restore test is due",
            "type": "boolean"
          },
          "verifiedBy": {
            "description": "The administrator who recorded the last test; null once that account is gone",
            "nullable": true,
            "properties": {
              "id": {
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "id",
              "name"
            ],
            "type": "object"
          }
        },
        "required": [
          "dueAt",
          "intervalDays",
          "metadataVerifiedAt",
          "originalsVerifiedAt",
          "overdue",
          "verifiedBy"
        ],
        "type": "object"
      },
      "BackupRestoreVerificationRecordDto": {
        "properties": {
          "metadata": {
            "description": "The database restored and was checked",
            "type": "boolean"
          },
          "originals": {
            "description": "Original files restored and their checksums were verified",
            "type": "boolean"
          }
        },
        "required": [
          "metadata",
          "originals"
        ],
        "type": "object"
      },
      "DatabaseBackupUploadDto": {
        "properties": {
          "file": {
            "description": "Database backup file",
            "format": "binary",
            "type": "string"
          }
        },
        "type": "object"
      },
      "FileTrashResponseDto": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/FileTrashItemResponseDto"
            },
            "type": "array"
          },
          "total": {
            "description": "Entries in the file trash",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "totalBytes": {
            "description": "Disk space the file trash holds, in bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total",
          "totalBytes"
        ],
        "type": "object"
      },
      "FileTrashItemResponseDto": {
        "properties": {
          "checksum": {
            "description": "Hex-encoded SHA-256 checksum of the file",
            "type": "string"
          },
          "id": {
            "description": "File trash entry id",
            "type": "string"
          },
          "lastAssetId": {
            "description": "Asset that held the file last, when known",
            "nullable": true,
            "type": "string"
          },
          "lastOwnerId": {
            "description": "Account whose library held the file last, when known",
            "nullable": true,
            "type": "string"
          },
          "lastOwnerName": {
            "description": "Name of that account, while it exists",
            "nullable": true,
            "type": "string"
          },
          "originalFileName": {
            "description": "Name of the file when it was last in a library",
            "type": "string"
          },
          "sizeInBytes": {
            "description": "Size of the file in bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "trashedAt": {
            "description": "When the file was moved to the file trash",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "checksum",
          "id",
          "lastAssetId",
          "lastOwnerId",
          "lastOwnerName",
          "originalFileName",
          "sizeInBytes",
          "trashedAt"
        ],
        "type": "object"
      },
      "FileTrashRestoreResponseDto": {
        "properties": {
          "assetId": {
            "description": "The new asset the file was restored as, in its last owner’s library",
            "type": "string"
          }
        },
        "required": [
          "assetId"
        ],
        "type": "object"
      },
      "IntegrityReportResponseDto": {
        "properties": {
          "items": {
            "items": {
              "properties": {
                "id": {
                  "description": "Integrity report item id",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "path": {
                  "description": "Integrity report item path",
                  "type": "string"
                },
                "type": {
                  "$ref": "#/components/schemas/IntegrityReport"
                }
              },
              "required": [
                "id",
                "type",
                "path"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "nextCursor": {
            "type": "string"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "IntegrityReport": {
        "description": "Integrity report type",
        "enum": [
          "untracked_file",
          "missing_file",
          "checksum_mismatch"
        ],
        "type": "string"
      },
      "IntegrityCheckRunsResponseDto": {
        "properties": {
          "checksum_mismatch": {
            "description": "When the checksum check last completed a full pass",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "missing_file": {
            "description": "When the missing-file check last completed",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "untracked_file": {
            "description": "When the untracked-file check last completed",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "checksum_mismatch",
          "missing_file",
          "untracked_file"
        ],
        "type": "object"
      },
      "IntegrityReportSummaryResponseDto": {
        "properties": {
          "checksum_mismatch": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "missing_file": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "untracked_file": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "checksum_mismatch",
          "missing_file",
          "untracked_file"
        ],
        "type": "object"
      },
      "MaintenanceDetectInstallResponseDto": {
        "properties": {
          "storage": {
            "items": {
              "$ref": "#/components/schemas/MaintenanceDetectInstallStorageFolderDto"
            },
            "type": "array"
          }
        },
        "required": [
          "storage"
        ],
        "type": "object"
      },
      "MaintenanceDetectInstallStorageFolderDto": {
        "properties": {
          "files": {
            "description": "Number of files in the folder",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "folder": {
            "$ref": "#/components/schemas/StorageFolder"
          },
          "readable": {
            "description": "Whether the folder is readable",
            "type": "boolean"
          },
          "writable": {
            "description": "Whether the folder is writable",
            "type": "boolean"
          }
        },
        "required": [
          "files",
          "folder",
          "readable",
          "writable"
        ],
        "type": "object"
      },
      "StorageFolder": {
        "description": "Storage folder",
        "enum": [
          "encoded-video",
          "library",
          "upload",
          "profile",
          "thumbs",
          "backups",
          "exports"
        ],
        "type": "string"
      },
      "MaintenanceAuthDto": {
        "properties": {
          "username": {
            "description": "Maintenance username",
            "type": "string"
          }
        },
        "required": [
          "username"
        ],
        "type": "object"
      },
      "MaintenanceLoginDto": {
        "properties": {
          "token": {
            "description": "Maintenance token",
            "type": "string"
          }
        },
        "type": "object"
      },
      "MaintenanceStatusResponseDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/MaintenanceAction"
          },
          "active": {
            "type": "boolean"
          },
          "error": {
            "type": "string"
          },
          "progress": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "reason": {
            "description": "Why the server is in maintenance, as set by the administrator (public)",
            "type": "string"
          },
          "task": {
            "type": "string"
          }
        },
        "required": [
          "action",
          "active"
        ],
        "type": "object"
      },
      "MaintenanceAction": {
        "description": "Maintenance action",
        "enum": [
          "start",
          "end",
          "select_database_restore",
          "restore_database"
        ],
        "type": "string"
      },
      "NotificationDto": {
        "properties": {
          "createdAt": {
            "description": "Creation date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "data": {
            "additionalProperties": {},
            "description": "Additional notification data",
            "type": "object"
          },
          "description": {
            "description": "Notification description",
            "type": "string"
          },
          "id": {
            "description": "Notification ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "level": {
            "$ref": "#/components/schemas/NotificationLevel"
          },
          "readAt": {
            "description": "Date when notification was read",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "title": {
            "description": "Notification title",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/NotificationType"
          }
        },
        "required": [
          "createdAt",
          "id",
          "level",
          "title",
          "type"
        ],
        "type": "object"
      },
      "NotificationType": {
        "description": "Notification type",
        "enum": [
          "JobFailed",
          "BackupFailed",
          "SystemMessage",
          "AlbumInvite",
          "AlbumUpdate",
          "ItemShare",
          "ClusterGroupRequest",
          "SharedSpaceMention",
          "SharedSpaceReply",
          "Custom"
        ],
        "type": "string"
      },
      "NotificationLevel": {
        "description": "Notification level",
        "enum": [
          "success",
          "error",
          "warning",
          "info"
        ],
        "type": "string"
      },
      "NotificationCreateDto": {
        "properties": {
          "data": {
            "additionalProperties": {},
            "description": "Additional notification data",
            "type": "object"
          },
          "description": {
            "description": "Notification description",
            "nullable": true,
            "type": "string"
          },
          "level": {
            "$ref": "#/components/schemas/NotificationLevel"
          },
          "readAt": {
            "description": "Date when notification was read",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "title": {
            "description": "Notification title",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/NotificationType"
          },
          "userId": {
            "description": "User ID to send notification to",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "title",
          "userId"
        ],
        "type": "object"
      },
      "TemplateResponseDto": {
        "properties": {
          "html": {
            "description": "Template HTML content",
            "type": "string"
          },
          "name": {
            "description": "Template name",
            "type": "string"
          }
        },
        "required": [
          "html",
          "name"
        ],
        "type": "object"
      },
      "TemplateDto": {
        "properties": {
          "template": {
            "description": "Template name",
            "type": "string"
          }
        },
        "required": [
          "template"
        ],
        "type": "object"
      },
      "TestEmailResponseDto": {
        "properties": {
          "messageId": {
            "description": "Email message ID",
            "type": "string"
          }
        },
        "required": [
          "messageId"
        ],
        "type": "object"
      },
      "AdminConfigSmtpDto": {
        "properties": {
          "enabled": {
            "description": "Whether SMTP email notifications are enabled",
            "type": "boolean"
          },
          "from": {
            "description": "Email address to send from",
            "type": "string"
          },
          "replyTo": {
            "description": "Email address for replies",
            "type": "string"
          },
          "transport": {
            "$ref": "#/components/schemas/AdminConfigSmtpTransportDto"
          }
        },
        "required": [
          "enabled",
          "from",
          "replyTo",
          "transport"
        ],
        "type": "object"
      },
      "AdminConfigSmtpTransportDto": {
        "properties": {
          "host": {
            "description": "SMTP server hostname",
            "type": "string"
          },
          "ignoreCert": {
            "description": "Whether to ignore SSL certificate errors",
            "type": "boolean"
          },
          "password": {
            "description": "SMTP password (write-only; empty preserves the existing password)",
            "type": "string"
          },
          "passwordConfigured": {
            "description": "Read-only indicator that an SMTP password is stored. Set by the server; ignored on write.",
            "type": "boolean"
          },
          "port": {
            "description": "SMTP server port",
            "maximum": 65535,
            "minimum": 0,
            "type": "integer"
          },
          "secure": {
            "description": "Whether to use secure connection (TLS/SSL)",
            "type": "boolean"
          },
          "username": {
            "description": "SMTP username",
            "type": "string"
          }
        },
        "required": [
          "host",
          "ignoreCert",
          "password",
          "port",
          "secure",
          "username"
        ],
        "type": "object"
      },
      "PhysicalDeduplicationVerificationDto": {
        "properties": {
          "copies": {
            "description": "Copies the plan applied, listed or not",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "hiddenCopies": {
            "description": "Copies that are Locked media of another account; counted, never named",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/PhysicalDeduplicationVerificationItemDto"
            },
            "type": "array"
          },
          "notLinked": {
            "description": "Copies that no longer resolve to the retained original",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "operationId": {
            "type": "string"
          },
          "planId": {
            "type": "string"
          },
          "removed": {
            "description": "Copies whose own file is gone: that cannot be undone",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "restorable": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "restored": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "retainedChanged": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "retainedIntact": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "retainedMissing": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "retainedOriginals": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "verified": {
            "description": "Copies that resolve to a retained original still holding the reviewed bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "verifiedAt": {
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "type": "string"
          }
        },
        "required": [
          "copies",
          "hiddenCopies",
          "items",
          "notLinked",
          "operationId",
          "planId",
          "removed",
          "restorable",
          "restored",
          "retainedChanged",
          "retainedIntact",
          "retainedMissing",
          "retainedOriginals",
          "verified",
          "verifiedAt"
        ],
        "type": "object"
      },
      "PhysicalDeduplicationVerificationItemDto": {
        "properties": {
          "assetId": {
            "type": "string"
          },
          "canView": {
            "description": "Whether the requesting administrator may view this asset and its thumbnail",
            "type": "boolean"
          },
          "copyFile": {
            "$ref": "#/components/schemas/PhysicalDeduplicationCopyFile"
          },
          "linked": {
            "description": "Whether the asset still resolves to the retained original",
            "type": "boolean"
          },
          "originalFileName": {
            "type": "string"
          },
          "ownerName": {
            "type": "string"
          },
          "restorable": {
            "description": "Whether the asset can go back to its own file: it is linked and that file still holds the reviewed bytes",
            "type": "boolean"
          },
          "restored": {
            "description": "Whether the asset is back on its own former file",
            "type": "boolean"
          },
          "retainedFile": {
            "$ref": "#/components/schemas/PhysicalDeduplicationRetainedFile"
          },
          "type": {
            "$ref": "#/components/schemas/AssetTypeEnum"
          }
        },
        "required": [
          "assetId",
          "canView",
          "copyFile",
          "linked",
          "originalFileName",
          "ownerName",
          "restorable",
          "restored",
          "retainedFile",
          "type"
        ],
        "type": "object"
      },
      "AssetTypeEnum": {
        "description": "Asset type",
        "enum": [
          "IMAGE",
          "VIDEO",
          "AUDIO",
          "OTHER"
        ],
        "type": "string"
      },
      "PhysicalDeduplicationRetainedFile": {
        "description": "The retained original on disk: still the reviewed bytes, gone, or different bytes",
        "enum": [
          "intact",
          "missing",
          "changed"
        ],
        "type": "string"
      },
      "PhysicalDeduplicationCopyFile": {
        "description": "The copy's own former file: removed from disk, still the reviewed bytes, or different bytes now",
        "enum": [
          "removed",
          "present",
          "changed"
        ],
        "type": "string"
      },
      "PhysicalDeduplicationRestoreRequestDto": {
        "properties": {
          "assetId": {
            "description": "A copy of the applied plan whose own file is still on disk",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "assetId"
        ],
        "type": "object"
      },
      "PhysicalDeduplicationReviewResponseDto": {
        "properties": {
          "confirmation": {
            "description": "The phrase to type to apply this plan",
            "type": "string"
          },
          "copies": {
            "description": "Copies the reviewed plan will share",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "estimatedBytes": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "excludedRetainedAssetIds": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "fingerprint": {
            "type": "string"
          },
          "hiddenCopies": {
            "description": "Copies in the reviewed plan that are Locked media of another account; counted, never named",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "planId": {
            "type": "string"
          },
          "retainedOriginals": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "reviewToken": {
            "description": "Binds the plan to these per-group decisions; applying must present it",
            "type": "string"
          },
          "reviewedAt": {
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "type": "string"
          }
        },
        "required": [
          "confirmation",
          "copies",
          "estimatedBytes",
          "excludedRetainedAssetIds",
          "fingerprint",
          "hiddenCopies",
          "planId",
          "retainedOriginals",
          "reviewToken",
          "reviewedAt"
        ],
        "type": "object"
      },
      "PhysicalDeduplicationReviewRequestDto": {
        "properties": {
          "excludedRetainedAssetIds": {
            "description": "Retained originals whose group the administrator decided to leave as they are",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 500,
            "type": "array"
          },
          "fingerprint": {
            "description": "The fingerprint of the plan on screen, from the preview",
            "pattern": "^[\\da-f]{64}$",
            "type": "string"
          }
        },
        "required": [
          "fingerprint"
        ],
        "type": "object"
      },
      "PhysicalDeduplicationPreviewResponseDto": {
        "properties": {
          "applies": {
            "description": "Recently applied plans, newest first ()",
            "items": {
              "$ref": "#/components/schemas/PhysicalDeduplicationApplyDto"
            },
            "type": "array"
          },
          "applying": {
            "description": "Whether a reviewed plan is being applied ()",
            "type": "boolean"
          },
          "enabled": {
            "description": "The saved `physicalDeduplication.enabled`",
            "type": "boolean"
          },
          "plan": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PhysicalDeduplicationPlanDto"
              }
            ],
            "description": "The latest plan, or null when none has run",
            "nullable": true
          },
          "running": {
            "description": "Whether a deduplication preview is queued or active",
            "type": "boolean"
          },
          "savedMasterUserId": {
            "description": "The saved `physicalDeduplication.masterUserId`",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "applies",
          "applying",
          "enabled",
          "plan",
          "running",
          "savedMasterUserId"
        ],
        "type": "object"
      },
      "PhysicalDeduplicationPlanDto": {
        "properties": {
          "applicableCopies": {
            "description": "Copies listed with a share decision: the most this plan can apply. Copies past the list limit wait for a later plan",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "copies": {
            "items": {
              "$ref": "#/components/schemas/PhysicalDeduplicationCopyDto"
            },
            "type": "array"
          },
          "copiesTruncated": {
            "description": "True when more copies were reviewed than the stored preview keeps; totals still cover all of them",
            "type": "boolean"
          },
          "deletedBytes": {
            "description": "Measured: bytes actually removed from disk by applying this plan so far",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "eligibleAssets": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "fingerprint": {
            "description": "Digest over the plan evidence; changes with every preview ()",
            "type": "string"
          },
          "hiddenCopies": {
            "description": "Copies left out of the rows because they are Locked media of another account; counted, never named",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "linkedAssets": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "logicalBytes": {
            "description": "Logical asset bytes (): the sizes of every asset that references a shared original once this plan is applied, counted once per asset",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "masterUserId": {
            "description": "Account whose originals are retained by this plan",
            "type": "string"
          },
          "masterUserName": {
            "description": "Display name of the retained account",
            "type": "string"
          },
          "mode": {
            "$ref": "#/components/schemas/PhysicalDeduplicationPlanMode"
          },
          "planId": {
            "description": "Short name of this plan, typed to confirm applying it ()",
            "type": "string"
          },
          "ranAt": {
            "description": "When the plan was produced",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "type": "string"
          },
          "reclaimableBytes": {
            "description": "Estimate: bytes of the copies to share, with their generated files, that applying would free",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "retained": {
            "items": {
              "$ref": "#/components/schemas/PhysicalDeduplicationRetainedDto"
            },
            "type": "array"
          },
          "scopeUserId": {
            "description": "When set, only copies owned by this account were reviewed; null means every account",
            "nullable": true,
            "type": "string"
          },
          "scopeUserName": {
            "nullable": true,
            "type": "string"
          },
          "sharedOriginalBytes": {
            "description": "Physical shared-original bytes (): the retained originals those assets share, counted once per file",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "skippedExternal": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "skippedMissingMaster": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "applicableCopies",
          "copies",
          "copiesTruncated",
          "deletedBytes",
          "eligibleAssets",
          "fingerprint",
          "hiddenCopies",
          "linkedAssets",
          "logicalBytes",
          "masterUserId",
          "masterUserName",
          "mode",
          "planId",
          "ranAt",
          "reclaimableBytes",
          "retained",
          "scopeUserId",
          "scopeUserName",
          "sharedOriginalBytes",
          "skippedExternal",
          "skippedMissingMaster"
        ],
        "type": "object"
      },
      "PhysicalDeduplicationRetainedDto": {
        "properties": {
          "assetId": {
            "description": "Asset that keeps the original file",
            "type": "string"
          },
          "canView": {
            "description": "Whether the requesting administrator may view this asset and its thumbnail",
            "type": "boolean"
          },
          "checksum": {
            "description": "Hex-encoded SHA-1 checksum of the original file",
            "type": "string"
          },
          "duration": {
            "description": "Video length in milliseconds, when known",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "fileAvailable": {
            "description": "Whether the retained original file is on disk now, checked on every read (UT-24)",
            "type": "boolean"
          },
          "height": {
            "description": "Height in pixels, when known",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "hiddenCopies": {
            "description": "Copies this retained original would share that are Locked media of another account; counted, never named ()",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "originalFileName": {
            "type": "string"
          },
          "originalPath": {
            "description": "Path of the retained original file",
            "type": "string"
          },
          "ownerId": {
            "description": "Owner of the retained asset (the retained account)",
            "type": "string"
          },
          "ownerName": {
            "description": "Display name of the retained account",
            "type": "string"
          },
          "referencesAfter": {
            "description": "Assets that would reference this original after the plan is applied",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "referencesBefore": {
            "description": "Assets that reference this original before the plan is applied (including the retained asset)",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "sizeInBytes": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "type": {
            "$ref": "#/components/schemas/AssetTypeEnum"
          },
          "width": {
            "description": "Width in pixels, when known",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "assetId",
          "canView",
          "checksum",
          "duration",
          "fileAvailable",
          "height",
          "hiddenCopies",
          "originalFileName",
          "originalPath",
          "ownerId",
          "ownerName",
          "referencesAfter",
          "referencesBefore",
          "sizeInBytes",
          "type",
          "width"
        ],
        "type": "object"
      },
      "PhysicalDeduplicationPlanMode": {
        "description": "Whether the physical deduplication plan was a preview or an applied run",
        "enum": [
          "dry-run",
          "apply"
        ],
        "type": "string"
      },
      "PhysicalDeduplicationCopyDto": {
        "properties": {
          "assetId": {
            "description": "Duplicate asset owned by a non-retained account",
            "type": "string"
          },
          "canView": {
            "description": "Whether the requesting administrator may view this asset and its thumbnail",
            "type": "boolean"
          },
          "checksum": {
            "description": "Hex-encoded SHA-1 checksum of the original file",
            "type": "string"
          },
          "checksumMatch": {
            "description": "Whether checksum and byte size match a retained original",
            "type": "boolean"
          },
          "decision": {
            "$ref": "#/components/schemas/PhysicalDeduplicationDecision"
          },
          "duration": {
            "description": "Video length in milliseconds, when known",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "height": {
            "description": "Height in pixels, when known",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "originalFileName": {
            "type": "string"
          },
          "originalPath": {
            "description": "Path of the duplicate copy on disk",
            "type": "string"
          },
          "ownerId": {
            "type": "string"
          },
          "ownerName": {
            "description": "Display name of the copy owner",
            "type": "string"
          },
          "reason": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PhysicalDeduplicationSkipReason"
              }
            ],
            "description": "Present when the decision is skip",
            "nullable": true
          },
          "retainedAssetId": {
            "description": "Retained original this copy matches, if any",
            "nullable": true,
            "type": "string"
          },
          "sizeInBytes": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "type": {
            "$ref": "#/components/schemas/AssetTypeEnum"
          },
          "width": {
            "description": "Width in pixels, when known",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "assetId",
          "canView",
          "checksum",
          "checksumMatch",
          "decision",
          "duration",
          "height",
          "originalFileName",
          "originalPath",
          "ownerId",
          "ownerName",
          "reason",
          "retainedAssetId",
          "sizeInBytes",
          "type",
          "width"
        ],
        "type": "object"
      },
      "PhysicalDeduplicationSkipReason": {
        "description": "Why a duplicate copy is skipped by the physical deduplication plan",
        "enum": [
          "external-library",
          "missing-size",
          "no-retained-match",
          "already-shared",
          "retained-file-missing"
        ],
        "type": "string"
      },
      "PhysicalDeduplicationDecision": {
        "description": "Physical deduplication plan decision for a duplicate copy",
        "enum": [
          "share",
          "skip"
        ],
        "type": "string"
      },
      "PhysicalDeduplicationApplyDto": {
        "properties": {
          "alreadyApplied": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "applied": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "createdAt": {
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "type": "string"
          },
          "error": {
            "nullable": true,
            "type": "string"
          },
          "estimatedBytes": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "failed": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "fingerprint": {
            "type": "string"
          },
          "finishedAt": {
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "type": "string"
          },
          "mine": {
            "description": "Whether the requesting administrator applied it",
            "type": "boolean"
          },
          "operationId": {
            "description": "The media operation applying the plan",
            "type": "string"
          },
          "pauseRequested": {
            "type": "boolean"
          },
          "planId": {
            "type": "string"
          },
          "processed": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "progress": {
            "format": "double",
            "type": "number"
          },
          "reclaimedBytes": {
            "description": "Bytes actually removed from disk so far",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "requestedById": {
            "description": "Administrator who applied the plan; the job is theirs to pause or cancel",
            "type": "string"
          },
          "requestedByName": {
            "type": "string"
          },
          "retrying": {
            "description": "Waiting for its one automatic retry",
            "type": "boolean"
          },
          "skipped": {
            "description": "Copies left alone because their evidence changed",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/MediaOperationStatus"
          },
          "total": {
            "description": "Copies in the reviewed plan",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "alreadyApplied",
          "applied",
          "createdAt",
          "error",
          "estimatedBytes",
          "failed",
          "fingerprint",
          "finishedAt",
          "mine",
          "operationId",
          "pauseRequested",
          "planId",
          "processed",
          "progress",
          "reclaimedBytes",
          "requestedById",
          "requestedByName",
          "retrying",
          "skipped",
          "status",
          "total"
        ],
        "type": "object"
      },
      "MediaOperationStatus": {
        "description": "Media operation status",
        "enum": [
          "queued",
          "preparing",
          "rendering",
          "validating",
          "completed",
          "cancelling",
          "cancelled",
          "failed",
          "paused"
        ],
        "type": "string"
      },
      "PhysicalDeduplicationPreviewRequestDto": {
        "properties": {
          "masterUserId": {
            "description": "Account to retain originals in for this preview; defaults to the saved master account",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "scopeUserId": {
            "description": "Limit the review to copies owned by this account",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "CalendarHeatmapResponseDto": {
        "properties": {
          "from": {
            "description": "Start date in UTC",
            "example": "2024-01-01",
            "type": "string"
          },
          "series": {
            "items": {
              "properties": {
                "count": {
                  "description": "Activity count",
                  "maximum": 9007199254740991,
                  "minimum": 0,
                  "type": "integer"
                },
                "date": {
                  "description": "Date in UTC",
                  "example": "2024-01-01",
                  "type": "string"
                }
              },
              "required": [
                "date",
                "count"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "to": {
            "description": "End date in UTC",
            "example": "2024-12-31",
            "type": "string"
          },
          "totalCount": {
            "description": "Total activity count over the period",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "from",
          "series",
          "to",
          "totalCount"
        ],
        "type": "object"
      },
      "CalendarHeatmapType": {
        "description": "Type of calendar heatmap",
        "enum": [
          "Upload",
          "Taken"
        ],
        "type": "string"
      },
      "UserAdminPinCodeStateResponseDto": {
        "properties": {
          "pinCode": {
            "description": "Whether the account has a PIN set",
            "type": "boolean"
          }
        },
        "required": [
          "pinCode"
        ],
        "type": "object"
      },
      "UserPreferencesResponseDto": {
        "properties": {
          "albums": {
            "$ref": "#/components/schemas/AlbumsResponse"
          },
          "cast": {
            "$ref": "#/components/schemas/CastResponse"
          },
          "download": {
            "$ref": "#/components/schemas/DownloadResponse"
          },
          "emailNotifications": {
            "$ref": "#/components/schemas/EmailNotificationsResponse"
          },
          "folders": {
            "$ref": "#/components/schemas/FoldersResponse"
          },
          "lockedRulesRevealed": {
            "description": "Whether privacy.suppression names the account's Locked people, pets and tags. False when they were blanked (a session that is not unlocked, or an administrator); such rules must never be edited and saved back ()",
            "type": "boolean"
          },
          "memories": {
            "$ref": "#/components/schemas/MemoriesResponse"
          },
          "people": {
            "$ref": "#/components/schemas/PeopleResponse"
          },
          "privacy": {
            "$ref": "#/components/schemas/PrivacyResponse"
          },
          "purchase": {
            "$ref": "#/components/schemas/PurchaseResponse"
          },
          "ratings": {
            "$ref": "#/components/schemas/RatingsResponse"
          },
          "recentlyAdded": {
            "$ref": "#/components/schemas/RecentlyAddedResponse"
          },
          "revision": {
            "description": "Changes whenever the stored preferences change; send it back as expectedRevision to reject stale saves",
            "type": "string"
          },
          "savedSearches": {
            "description": "Saved searches (always present). Empty for an administrator, and without any that names a Locked person, pet or tag while the session is locked",
            "items": {
              "$ref": "#/components/schemas/SavedSearch"
            },
            "type": "array"
          },
          "sharedLinks": {
            "$ref": "#/components/schemas/SharedLinksResponse"
          },
          "tags": {
            "$ref": "#/components/schemas/TagsResponse"
          }
        },
        "required": [
          "albums",
          "cast",
          "download",
          "emailNotifications",
          "folders",
          "lockedRulesRevealed",
          "memories",
          "people",
          "privacy",
          "purchase",
          "ratings",
          "recentlyAdded",
          "revision",
          "sharedLinks",
          "tags"
        ],
        "type": "object"
      },
      "TagsResponse": {
        "properties": {
          "enabled": {
            "description": "Whether tags are enabled",
            "type": "boolean"
          },
          "sidebarWeb": {
            "description": "Whether tags appear in web sidebar",
            "type": "boolean"
          }
        },
        "required": [
          "enabled",
          "sidebarWeb"
        ],
        "type": "object"
      },
      "SharedLinksResponse": {
        "properties": {
          "enabled": {
            "description": "Whether shared links are enabled",
            "type": "boolean"
          },
          "sidebarWeb": {
            "description": "Whether shared links appear in web sidebar",
            "type": "boolean"
          }
        },
        "required": [
          "enabled",
          "sidebarWeb"
        ],
        "type": "object"
      },
      "SavedSearch": {
        "properties": {
          "name": {
            "description": "Name shown in the search palette",
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "query": {
            "additionalProperties": {},
            "description": "The search body to run, as the client sends it to the search endpoints",
            "type": "object"
          }
        },
        "required": [
          "name",
          "query"
        ],
        "type": "object"
      },
      "RecentlyAddedResponse": {
        "properties": {
          "sidebarWeb": {
            "description": "Whether the recently added page appears in the web sidebar",
            "type": "boolean"
          }
        },
        "required": [
          "sidebarWeb"
        ],
        "type": "object"
      },
      "RatingsResponse": {
        "properties": {
          "enabled": {
            "description": "Whether ratings are enabled",
            "type": "boolean"
          }
        },
        "required": [
          "enabled"
        ],
        "type": "object"
      },
      "PurchaseResponse": {
        "properties": {
          "hideBuyButtonUntil": {
            "description": "Date until which to hide buy button",
            "type": "string"
          },
          "showSupportBadge": {
            "description": "Whether to show support badge",
            "type": "boolean"
          }
        },
        "required": [
          "hideBuyButtonUntil",
          "showSupportBadge"
        ],
        "type": "object"
      },
      "PrivacyResponse": {
        "description": "Privacy preferences",
        "properties": {
          "suppression": {
            "$ref": "#/components/schemas/SuppressionResponse"
          }
        },
        "required": [
          "suppression"
        ],
        "type": "object"
      },
      "SuppressionResponse": {
        "properties": {
          "personIds": {
            "description": "Person IDs to suppress from locked browsing sessions",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "petIds": {
            "description": "Pet IDs to suppress from locked browsing sessions",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "scope": {
            "$ref": "#/components/schemas/SuppressionScope",
            "description": "Whether suppression applies only to owned assets or all visible assets"
          },
          "tagIds": {
            "description": "Tag IDs to suppress from locked browsing sessions",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "personIds",
          "petIds",
          "scope",
          "tagIds"
        ],
        "type": "object"
      },
      "SuppressionScope": {
        "enum": [
          "owned",
          "visible"
        ],
        "type": "string"
      },
      "PeopleResponse": {
        "properties": {
          "enabled": {
            "description": "Whether people are enabled",
            "type": "boolean"
          },
          "minimumFaces": {
            "description": "People face threshold",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "sidebarWeb": {
            "description": "Whether people appear in web sidebar",
            "type": "boolean"
          }
        },
        "required": [
          "enabled",
          "sidebarWeb"
        ],
        "type": "object"
      },
      "MemoriesResponse": {
        "properties": {
          "duration": {
            "description": "Memory duration in seconds",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "enabled": {
            "description": "Whether memories are enabled",
            "type": "boolean"
          },
          "sidebarWeb": {
            "description": "Whether memories appear in web sidebar",
            "type": "boolean"
          }
        },
        "required": [
          "duration",
          "enabled",
          "sidebarWeb"
        ],
        "type": "object"
      },
      "FoldersResponse": {
        "properties": {
          "enabled": {
            "description": "Whether folders are enabled",
            "type": "boolean"
          },
          "sidebarWeb": {
            "description": "Whether folders appear in web sidebar",
            "type": "boolean"
          }
        },
        "required": [
          "enabled",
          "sidebarWeb"
        ],
        "type": "object"
      },
      "EmailNotificationsResponse": {
        "properties": {
          "albumInvite": {
            "description": "Whether to receive email notifications for album invites",
            "type": "boolean"
          },
          "albumUpdate": {
            "description": "Whether to receive email notifications for album updates",
            "type": "boolean"
          },
          "enabled": {
            "description": "Whether email notifications are enabled",
            "type": "boolean"
          }
        },
        "required": [
          "albumInvite",
          "albumUpdate",
          "enabled"
        ],
        "type": "object"
      },
      "DownloadResponse": {
        "properties": {
          "archiveSize": {
            "description": "Maximum archive size in bytes",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "includeEmbeddedVideos": {
            "description": "Whether to include embedded videos in downloads",
            "type": "boolean"
          }
        },
        "required": [
          "archiveSize",
          "includeEmbeddedVideos"
        ],
        "type": "object"
      },
      "CastResponse": {
        "properties": {
          "adminDisabled": {
            "description": "Whether an administrator has turned casting off for this user",
            "type": "boolean"
          },
          "gCastEnabled": {
            "description": "Whether Google Cast is enabled (always false while an administrator has turned casting off)",
            "type": "boolean"
          }
        },
        "required": [
          "adminDisabled",
          "gCastEnabled"
        ],
        "type": "object"
      },
      "AlbumsResponse": {
        "properties": {
          "defaultAssetOrder": {
            "$ref": "#/components/schemas/AssetOrder"
          }
        },
        "required": [
          "defaultAssetOrder"
        ],
        "type": "object"
      },
      "AssetOrder": {
        "description": "Asset sort order",
        "enum": [
          "asc",
          "desc"
        ],
        "type": "string"
      },
      "UserPreferencesUpdateDto": {
        "properties": {
          "albums": {
            "$ref": "#/components/schemas/AlbumsUpdate"
          },
          "avatar": {
            "$ref": "#/components/schemas/AvatarUpdate"
          },
          "cast": {
            "$ref": "#/components/schemas/CastUpdate"
          },
          "download": {
            "$ref": "#/components/schemas/DownloadUpdate"
          },
          "emailNotifications": {
            "$ref": "#/components/schemas/EmailNotificationsUpdate"
          },
          "expectedRevision": {
            "description": "The revision these changes were made against. When it no longer matches the stored preferences the update is rejected with 409 and nothing is changed",
            "type": "string"
          },
          "folders": {
            "$ref": "#/components/schemas/FoldersUpdate"
          },
          "memories": {
            "$ref": "#/components/schemas/MemoriesUpdate"
          },
          "people": {
            "$ref": "#/components/schemas/PeopleUpdate"
          },
          "privacy": {
            "$ref": "#/components/schemas/PrivacyUpdate"
          },
          "purchase": {
            "$ref": "#/components/schemas/PurchaseUpdate"
          },
          "ratings": {
            "$ref": "#/components/schemas/RatingsUpdate"
          },
          "recentlyAdded": {
            "$ref": "#/components/schemas/RecentlyAddedUpdate"
          },
          "savedSearches": {
            "description": "Saved searches, replacing the whole list (at most 50). Only the account itself can change them",
            "items": {
              "$ref": "#/components/schemas/SavedSearch"
            },
            "maxItems": 50,
            "type": "array"
          },
          "sharedLinks": {
            "$ref": "#/components/schemas/SharedLinksUpdate"
          },
          "tags": {
            "$ref": "#/components/schemas/TagsUpdate"
          }
        },
        "type": "object"
      },
      "TagsUpdate": {
        "properties": {
          "enabled": {
            "description": "Whether tags are enabled",
            "type": "boolean"
          },
          "sidebarWeb": {
            "description": "Whether tags appear in web sidebar",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "SharedLinksUpdate": {
        "properties": {
          "enabled": {
            "description": "Whether shared links are enabled",
            "type": "boolean"
          },
          "sidebarWeb": {
            "description": "Whether shared links appear in web sidebar",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "RecentlyAddedUpdate": {
        "properties": {
          "sidebarWeb": {
            "description": "Whether the recently added page appears in the web sidebar",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "RatingsUpdate": {
        "properties": {
          "enabled": {
            "description": "Whether ratings are enabled",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "PurchaseUpdate": {
        "properties": {
          "hideBuyButtonUntil": {
            "description": "Date until which to hide buy button",
            "type": "string"
          },
          "showSupportBadge": {
            "description": "Whether to show support badge",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "PrivacyUpdate": {
        "description": "Privacy preferences",
        "properties": {
          "suppression": {
            "$ref": "#/components/schemas/SuppressionUpdate"
          }
        },
        "type": "object"
      },
      "SuppressionUpdate": {
        "properties": {
          "personIds": {
            "description": "Person IDs to suppress from locked browsing sessions",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "petIds": {
            "description": "Pet IDs to suppress from locked browsing sessions",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "scope": {
            "$ref": "#/components/schemas/SuppressionScope",
            "description": "Whether suppression applies only to owned assets or all visible assets"
          },
          "tagIds": {
            "description": "Tag IDs to suppress from locked browsing sessions",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "PeopleUpdate": {
        "properties": {
          "enabled": {
            "description": "Whether people are enabled",
            "type": "boolean"
          },
          "minimumFaces": {
            "description": "People face threshold",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "sidebarWeb": {
            "description": "Whether people appear in web sidebar",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "MemoriesUpdate": {
        "properties": {
          "duration": {
            "description": "Memory duration in seconds",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "enabled": {
            "description": "Whether memories are enabled",
            "type": "boolean"
          },
          "sidebarWeb": {
            "description": "Whether memories appear in web sidebar",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "FoldersUpdate": {
        "properties": {
          "enabled": {
            "description": "Whether folders are enabled",
            "type": "boolean"
          },
          "sidebarWeb": {
            "description": "Whether folders appear in web sidebar",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "EmailNotificationsUpdate": {
        "properties": {
          "albumInvite": {
            "description": "Whether to receive email notifications for album invites",
            "type": "boolean"
          },
          "albumUpdate": {
            "description": "Whether to receive email notifications for album updates",
            "type": "boolean"
          },
          "enabled": {
            "description": "Whether email notifications are enabled",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "DownloadUpdate": {
        "properties": {
          "archiveSize": {
            "description": "Maximum archive size in bytes",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "includeEmbeddedVideos": {
            "description": "Whether to include embedded videos in downloads",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "CastUpdate": {
        "properties": {
          "adminDisabled": {
            "description": "Administrator only: turn casting off for this user. Accepted only by the admin user preferences endpoint; ignored when a user updates their own preferences",
            "type": "boolean"
          },
          "gCastEnabled": {
            "description": "Whether Google Cast is enabled",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "AvatarUpdate": {
        "properties": {
          "color": {
            "$ref": "#/components/schemas/UserAvatarColor"
          }
        },
        "type": "object"
      },
      "AlbumsUpdate": {
        "description": "Album preferences",
        "properties": {
          "defaultAssetOrder": {
            "$ref": "#/components/schemas/AssetOrder"
          }
        },
        "type": "object"
      },
      "SessionResponseDto": {
        "properties": {
          "appVersion": {
            "description": "App version",
            "nullable": true,
            "type": "string"
          },
          "createdAt": {
            "description": "Creation date",
            "type": "string"
          },
          "current": {
            "description": "Is current session",
            "type": "boolean"
          },
          "deviceOS": {
            "description": "Device OS",
            "type": "string"
          },
          "deviceType": {
            "description": "Device type",
            "type": "string"
          },
          "expiresAt": {
            "description": "Expiration date",
            "type": "string"
          },
          "id": {
            "description": "Session ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isPendingSyncReset": {
            "description": "Is pending sync reset",
            "type": "boolean"
          },
          "updatedAt": {
            "description": "Last update date",
            "type": "string"
          }
        },
        "required": [
          "appVersion",
          "createdAt",
          "current",
          "deviceOS",
          "deviceType",
          "id",
          "isPendingSyncReset",
          "updatedAt"
        ],
        "type": "object"
      },
      "AssetStatsResponseDto": {
        "properties": {
          "images": {
            "description": "Number of images",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "total": {
            "description": "Total number of assets",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "videos": {
            "description": "Number of videos",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "images",
          "total",
          "videos"
        ],
        "type": "object"
      },
      "AssetVisibility": {
        "description": "Asset visibility",
        "enum": [
          "archive",
          "timeline",
          "hidden",
          "locked"
        ],
        "type": "string"
      },
      "AlbumSourceLinkResponseDto": {
        "properties": {
          "albumId": {
            "description": "The server album the source is linked to",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "albumName": {
            "description": "The server album name",
            "type": "string"
          },
          "createdAt": {
            "description": "When the link was made",
            "format": "date-time",
            "type": "string"
          },
          "deviceKey": {
            "description": "The device the source id belongs to, when it is device-local",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "Link ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/AlbumSourceKind"
          },
          "lastSourceName": {
            "description": "The phone name the server album last followed (the rename guard)",
            "type": "string"
          },
          "sourceId": {
            "description": "The source on the phone",
            "type": "string"
          },
          "updatedAt": {
            "description": "When the link last changed",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "albumId",
          "albumName",
          "createdAt",
          "deviceKey",
          "id",
          "kind",
          "lastSourceName",
          "sourceId",
          "updatedAt"
        ],
        "type": "object"
      },
      "AlbumSourceKind": {
        "description": "Where the source lives: an iOS Photos album or an Android folder",
        "enum": [
          "ios-photos",
          "android-folder"
        ],
        "type": "string"
      },
      "AlbumSourceResolveResponseDto": {
        "properties": {
          "links": {
            "description": "One link per requested source, in request order",
            "items": {
              "$ref": "#/components/schemas/AlbumSourceResolvedDto"
            },
            "type": "array"
          }
        },
        "required": [
          "links"
        ],
        "type": "object"
      },
      "AlbumSourceResolvedDto": {
        "properties": {
          "albumId": {
            "description": "The server album the source is linked to",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "albumName": {
            "description": "The server album name",
            "type": "string"
          },
          "createdAt": {
            "description": "When the link was made",
            "format": "date-time",
            "type": "string"
          },
          "deviceKey": {
            "description": "The device the source id belongs to, when it is device-local",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "Link ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/AlbumSourceKind"
          },
          "lastSourceName": {
            "description": "The phone name the server album last followed (the rename guard)",
            "type": "string"
          },
          "outcome": {
            "$ref": "#/components/schemas/AlbumSourceOutcome"
          },
          "sourceId": {
            "description": "The source on the phone",
            "type": "string"
          },
          "updatedAt": {
            "description": "When the link last changed",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "albumId",
          "albumName",
          "createdAt",
          "deviceKey",
          "id",
          "kind",
          "lastSourceName",
          "outcome",
          "sourceId",
          "updatedAt"
        ],
        "type": "object"
      },
      "AlbumSourceOutcome": {
        "description": "existing: the source was already linked; merged: linked to an existing album with the same name; created: a new album",
        "enum": [
          "existing",
          "merged",
          "created"
        ],
        "type": "string"
      },
      "AlbumSourceResolveDto": {
        "properties": {
          "sources": {
            "description": "The phone albums or folders to resolve",
            "items": {
              "$ref": "#/components/schemas/AlbumSourceDto"
            },
            "maxItems": 500,
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "sources"
        ],
        "type": "object"
      },
      "AlbumSourceDto": {
        "properties": {
          "deviceKey": {
            "description": "Set only when sourceId is device-local (an iOS localIdentifier, an Android bucket); null otherwise",
            "maxLength": 256,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/AlbumSourceKind"
          },
          "name": {
            "description": "The name of the album or folder on the phone",
            "maxLength": 255,
            "minLength": 1,
            "type": "string"
          },
          "sourceId": {
            "description": "The source on the phone: the iOS album PHCloudIdentifier when available, else its localIdentifier; on Android \"<bucketId>:<relativePath>\"",
            "maxLength": 1024,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "kind",
          "name",
          "sourceId"
        ],
        "type": "object"
      },
      "AlbumSourceUpdateResponseDto": {
        "properties": {
          "albumId": {
            "description": "The server album the source is linked to",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "albumName": {
            "description": "The server album name",
            "type": "string"
          },
          "createdAt": {
            "description": "When the link was made",
            "format": "date-time",
            "type": "string"
          },
          "deviceKey": {
            "description": "The device the source id belongs to, when it is device-local",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "Link ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/AlbumSourceKind"
          },
          "lastSourceName": {
            "description": "The phone name the server album last followed (the rename guard)",
            "type": "string"
          },
          "renamed": {
            "description": "Whether the server album was renamed (only while its name still equalled lastSourceName)",
            "type": "boolean"
          },
          "sourceId": {
            "description": "The source on the phone",
            "type": "string"
          },
          "updatedAt": {
            "description": "When the link last changed",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "albumId",
          "albumName",
          "createdAt",
          "deviceKey",
          "id",
          "kind",
          "lastSourceName",
          "renamed",
          "sourceId",
          "updatedAt"
        ],
        "type": "object"
      },
      "AlbumSourceUpdateDto": {
        "properties": {
          "name": {
            "description": "The new name of the album or folder on the phone",
            "maxLength": 255,
            "minLength": 1,
            "type": "string"
          },
          "sourceId": {
            "description": "Re-key the link to a new source id with the same kind and device (an Android folder rename changes its bucket)",
            "maxLength": 1024,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "BulkIdResponseDto": {
        "properties": {
          "error": {
            "$ref": "#/components/schemas/BulkIdErrorReason"
          },
          "errorMessage": {
            "type": "string"
          },
          "id": {
            "description": "ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "success": {
            "description": "Whether operation succeeded",
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "success"
        ],
        "type": "object"
      },
      "BulkIdErrorReason": {
        "description": "Error reason",
        "enum": [
          "duplicate",
          "no_permission",
          "not_found",
          "unknown",
          "validation"
        ],
        "type": "string"
      },
      "BulkIdsDto": {
        "properties": {
          "ids": {
            "description": "IDs to process",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "ids"
        ],
        "type": "object"
      },
      "AlbumResponseDto": {
        "properties": {
          "albumName": {
            "description": "Album name",
            "type": "string"
          },
          "albumThumbnailAssetId": {
            "description": "Thumbnail asset ID",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "albumUsers": {
            "description": "First entry is always the album owner. Second entry is the auth user, if it differs from the owner. The rest are ordered alphabetically.",
            "items": {
              "$ref": "#/components/schemas/AlbumUserResponseDto"
            },
            "minItems": 1,
            "type": "array"
          },
          "assetCount": {
            "description": "Number of assets",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "contributorCounts": {
            "items": {
              "$ref": "#/components/schemas/ContributorCountResponseDto"
            },
            "type": "array"
          },
          "coverFollowsNewest": {
            "description": "True when the cover always follows the newest item. Populated by GET /albums/{id} and PATCH /albums/{id}.",
            "type": "boolean"
          },
          "createdAt": {
            "description": "Creation date",
            "format": "date-time",
            "type": "string"
          },
          "description": {
            "description": "Album description",
            "type": "string"
          },
          "endDate": {
            "description": "End date (latest asset)",
            "format": "date-time",
            "type": "string"
          },
          "hasSharedLink": {
            "description": "Has shared link",
            "type": "boolean"
          },
          "icon": {
            "description": "Icon: a Material Design Icons name or legacy key (null = default icon)",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "Album ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isActivityEnabled": {
            "description": "Activity feed enabled",
            "type": "boolean"
          },
          "isSmart": {
            "description": "True when the album is filled by smart album rules. Populated by GET /albums/tree and GET /albums/{id}.",
            "type": "boolean"
          },
          "kind": {
            "$ref": "#/components/schemas/AlbumKind"
          },
          "lastModifiedAssetTimestamp": {
            "description": "Last modified asset timestamp",
            "format": "date-time",
            "type": "string"
          },
          "order": {
            "$ref": "#/components/schemas/AssetOrder"
          },
          "origin": {
            "$ref": "#/components/schemas/PartnerOriginDto",
            "description": "present on your own album when partner sharing copied it from another library"
          },
          "parentId": {
            "description": "Collection this album belongs to (null = top-level)",
            "nullable": true,
            "type": "string"
          },
          "shared": {
            "description": "Is shared album",
            "type": "boolean"
          },
          "smartKind": {
            "allOf": [
              {
                "$ref": "#/components/schemas/SmartAlbumBuiltInKind"
              }
            ],
            "description": "Built-in smart album kind behind this album, when it is a built-in smart album",
            "nullable": true
          },
          "smartRuleId": {
            "description": "Your classification rule behind this smart album, when it is one of yours",
            "nullable": true,
            "type": "string"
          },
          "sortOrder": {
            "description": "Sibling display position. Lower values appear first.",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "startDate": {
            "description": "Start date (earliest asset)",
            "format": "date-time",
            "type": "string"
          },
          "updatedAt": {
            "description": "Last update date",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "albumName",
          "albumThumbnailAssetId",
          "albumUsers",
          "assetCount",
          "createdAt",
          "description",
          "hasSharedLink",
          "icon",
          "id",
          "isActivityEnabled",
          "kind",
          "parentId",
          "shared",
          "sortOrder",
          "updatedAt"
        ],
        "type": "object"
      },
      "SmartAlbumBuiltInKind": {
        "enum": [
          "travel",
          "documents",
          "screenshots",
          "food",
          "pets",
          "nature"
        ],
        "type": "string"
      },
      "PartnerOriginDto": {
        "properties": {
          "rootOwnerId": {
            "description": "The account that originally uploaded or created it",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "rootOwnerName": {
            "description": "That account's name",
            "type": "string"
          }
        },
        "required": [
          "rootOwnerId",
          "rootOwnerName"
        ],
        "type": "object"
      },
      "AlbumKind": {
        "description": "Album kind: album (holds photos), collection (groups albums one level deep) or space (shared, top level)",
        "enum": [
          "album",
          "collection",
          "space"
        ],
        "type": "string"
      },
      "ContributorCountResponseDto": {
        "properties": {
          "assetCount": {
            "description": "Number of assets contributed",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "userId": {
            "description": "User ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "assetCount",
          "userId"
        ],
        "type": "object"
      },
      "AlbumUserResponseDto": {
        "properties": {
          "role": {
            "$ref": "#/components/schemas/AlbumUserRole"
          },
          "user": {
            "$ref": "#/components/schemas/UserResponseDto"
          }
        },
        "required": [
          "role",
          "user"
        ],
        "type": "object"
      },
      "AlbumUserRole": {
        "description": "Album user role",
        "enum": [
          "editor",
          "owner",
          "viewer"
        ],
        "type": "string"
      },
      "CreateAlbumDto": {
        "properties": {
          "albumName": {
            "description": "Album name",
            "type": "string"
          },
          "albumUsers": {
            "description": "Album users",
            "items": {
              "$ref": "#/components/schemas/AlbumUserCreateDto"
            },
            "type": "array"
          },
          "assetIds": {
            "description": "Initial asset IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "description": {
            "description": "Album description",
            "nullable": true,
            "type": "string"
          },
          "icon": {
            "description": "Optional icon: any Material Design Icons name (see GET /albums/icons)",
            "maxLength": 80,
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/AlbumKind",
            "default": "album",
            "description": "What to create: an album (default), a collection of albums or a shared space"
          },
          "parentId": {
            "description": "Collection to create the album inside (omit for top-level). Only albums nest, and only inside a collection.",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "albumName"
        ],
        "type": "object"
      },
      "AlbumUserCreateDto": {
        "properties": {
          "role": {
            "$ref": "#/components/schemas/AlbumUserRole"
          },
          "userId": {
            "description": "User ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "role",
          "userId"
        ],
        "type": "object"
      },
      "AlbumsAddAssetsResponseDto": {
        "properties": {
          "error": {
            "$ref": "#/components/schemas/BulkIdErrorReason"
          },
          "success": {
            "description": "Operation success",
            "type": "boolean"
          }
        },
        "required": [
          "success"
        ],
        "type": "object"
      },
      "AlbumsAddAssetsDto": {
        "properties": {
          "albumIds": {
            "description": "Album IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "assetIds": {
            "description": "Asset IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "albumIds",
          "assetIds"
        ],
        "type": "object"
      },
      "AlbumIconCatalogueResponseDto": {
        "properties": {
          "names": {
            "description": "Every valid icon name, sorted",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "suggested": {
            "description": "Categorised suggested set offered first",
            "items": {
              "$ref": "#/components/schemas/AlbumIconGroupResponseDto"
            },
            "type": "array"
          },
          "version": {
            "description": "Material Design Icons catalogue version the names come from",
            "type": "string"
          }
        },
        "required": [
          "names",
          "suggested",
          "version"
        ],
        "type": "object"
      },
      "AlbumIconGroupResponseDto": {
        "properties": {
          "icons": {
            "description": "Suggested icons in this category",
            "items": {
              "$ref": "#/components/schemas/AlbumIconSuggestionResponseDto"
            },
            "type": "array"
          },
          "label": {
            "description": "Category label",
            "type": "string"
          }
        },
        "required": [
          "icons",
          "label"
        ],
        "type": "object"
      },
      "AlbumIconSuggestionResponseDto": {
        "properties": {
          "label": {
            "description": "Human label for search and accessibility",
            "type": "string"
          },
          "name": {
            "description": "Material Design Icons name, e.g. mdiCameraOutline",
            "type": "string"
          }
        },
        "required": [
          "label",
          "name"
        ],
        "type": "object"
      },
      "AlbumOrderDto": {
        "properties": {
          "albumIds": {
            "description": "Every item of the group, in the order to show them. Must be exactly the group as it is now; a group that changed since the client loaded it is refused with 409.",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 5000,
            "minItems": 1,
            "type": "array"
          },
          "parentId": {
            "description": "Collection whose albums are ordered, or null for a top-level group (collections, albums on their own, or shared spaces)",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "albumIds",
          "parentId"
        ],
        "type": "object"
      },
      "AlbumStatisticsResponseDto": {
        "properties": {
          "notShared": {
            "description": "Number of non-shared albums",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "owned": {
            "description": "Number of owned albums",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "shared": {
            "description": "Number of shared albums",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "notShared",
          "owned",
          "shared"
        ],
        "type": "object"
      },
      "AlbumTreeResponseDto": {
        "properties": {
          "albums": {
            "description": "Albums that stand on their own (not inside a visible collection)",
            "items": {
              "$ref": "#/components/schemas/AlbumResponseDto"
            },
            "type": "array"
          },
          "collections": {
            "description": "Collections visible to the user with their albums",
            "items": {
              "$ref": "#/components/schemas/AlbumCollectionResponseDto"
            },
            "type": "array"
          },
          "spaces": {
            "description": "Shared spaces, always top level",
            "items": {
              "$ref": "#/components/schemas/AlbumResponseDto"
            },
            "type": "array"
          }
        },
        "required": [
          "albums",
          "collections",
          "spaces"
        ],
        "type": "object"
      },
      "AlbumCollectionResponseDto": {
        "properties": {
          "albumCount": {
            "description": "Number of albums inside the collection",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "albums": {
            "description": "Albums inside the collection, in display order",
            "items": {
              "$ref": "#/components/schemas/AlbumResponseDto"
            },
            "type": "array"
          },
          "assetCount": {
            "description": "Items in the collection and its albums (sum, not deduplicated)",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "collection": {
            "$ref": "#/components/schemas/AlbumResponseDto"
          }
        },
        "required": [
          "albumCount",
          "albums",
          "assetCount",
          "collection"
        ],
        "type": "object"
      },
      "UpdateAlbumDto": {
        "properties": {
          "albumName": {
            "description": "Album name",
            "type": "string"
          },
          "albumThumbnailAssetId": {
            "description": "Album thumbnail asset ID. Picking an item stops the cover following the newest item.",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "coverFollowsNewest": {
            "description": "Always use the newest item as the cover (true), or keep the current cover from now on (false). Cannot be true together with albumThumbnailAssetId.",
            "type": "boolean"
          },
          "description": {
            "description": "Album description",
            "nullable": true,
            "type": "string"
          },
          "icon": {
            "description": "Icon: any Material Design Icons name (null = clear / use default icon)",
            "maxLength": 80,
            "nullable": true,
            "type": "string"
          },
          "isActivityEnabled": {
            "description": "Enable activity feed",
            "type": "boolean"
          },
          "order": {
            "$ref": "#/components/schemas/AssetOrder"
          },
          "parentId": {
            "description": "Collection to move the album into (null = move to top-level, omit = no change)",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sortOrder": {
            "description": "Sibling display position. Lower values appear first. Computed by the client as a midpoint.",
            "format": "double",
            "type": "number"
          }
        },
        "type": "object"
      },
      "MoveAlbumDto": {
        "properties": {
          "collectionId": {
            "description": "Collection to move the album into, or null to take it out so it stands on its own",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "expectedParentId": {
            "description": "Where the client last saw the album (its collection, or null for on its own). When given and the album has been moved since, the move is refused with 409 instead of undoing the other change.",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "collectionId"
        ],
        "type": "object"
      },
      "AlbumDescendantCountResponseDto": {
        "properties": {
          "count": {
            "description": "Number of descendant albums (children, grandchildren, etc.)",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "type": "object"
      },
      "MapMarkerResponseDto": {
        "properties": {
          "city": {
            "description": "City name",
            "nullable": true,
            "type": "string"
          },
          "country": {
            "description": "Country name",
            "nullable": true,
            "type": "string"
          },
          "fileCreatedAt": {
            "description": "UTC timestamp when the asset was captured",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "Asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "lat": {
            "description": "Latitude",
            "format": "double",
            "type": "number"
          },
          "localDateTime": {
            "description": "Capture date and time in the local time zone where it was taken, encoded as UTC",
            "format": "date-time",
            "type": "string"
          },
          "lon": {
            "description": "Longitude",
            "format": "double",
            "type": "number"
          },
          "originalFileName": {
            "description": "Original file name",
            "type": "string"
          },
          "state": {
            "description": "State/Province name",
            "nullable": true,
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/AssetTypeEnum"
          }
        },
        "required": [
          "city",
          "country",
          "id",
          "lat",
          "lon",
          "state"
        ],
        "type": "object"
      },
      "UpdateAlbumUserDto": {
        "properties": {
          "role": {
            "$ref": "#/components/schemas/AlbumUserRole"
          }
        },
        "required": [
          "role"
        ],
        "type": "object"
      },
      "AddUsersDto": {
        "properties": {
          "albumUsers": {
            "description": "Album users to add",
            "items": {
              "$ref": "#/components/schemas/AlbumUserAddDto"
            },
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "albumUsers"
        ],
        "type": "object"
      },
      "AlbumUserAddDto": {
        "properties": {
          "role": {
            "$ref": "#/components/schemas/AlbumUserRole",
            "default": "editor",
            "description": "Album user role"
          },
          "userId": {
            "description": "User ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "userId"
        ],
        "type": "object"
      },
      "AnalyticsReportResponseDto": {
        "properties": {
          "albums": {
            "$ref": "#/components/schemas/AnalyticsAlbumsDto"
          },
          "cameras": {
            "items": {
              "$ref": "#/components/schemas/AnalyticsCameraDto"
            },
            "type": "array"
          },
          "days": {
            "items": {
              "$ref": "#/components/schemas/AnalyticsDayDto"
            },
            "type": "array"
          },
          "definitions": {
            "items": {
              "$ref": "#/components/schemas/AnalyticsSeriesDefinitionDto"
            },
            "type": "array"
          },
          "from": {
            "format": "date",
            "type": "string"
          },
          "generatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "history": {
            "$ref": "#/components/schemas/AnalyticsHistoryDto"
          },
          "host": {
            "$ref": "#/components/schemas/AnalyticsHostDto"
          },
          "insights": {
            "$ref": "#/components/schemas/AnalyticsInsightsDto",
            "description": "Dashboard breakdowns of the same items as summary. People, places and file names are only for the owner reading their own scope"
          },
          "metadata": {
            "items": {
              "$ref": "#/components/schemas/AnalyticsMetadataDto"
            },
            "type": "array"
          },
          "processing": {
            "$ref": "#/components/schemas/AnalyticsProcessingDto"
          },
          "range": {
            "$ref": "#/components/schemas/AnalyticsRange"
          },
          "scope": {
            "type": "string"
          },
          "scopeKind": {
            "$ref": "#/components/schemas/AnalyticsScopeKind"
          },
          "scopeLabel": {
            "description": "Account or library name; empty for the whole server",
            "type": "string"
          },
          "series": {
            "items": {
              "$ref": "#/components/schemas/AnalyticsBucketDto"
            },
            "type": "array"
          },
          "summary": {
            "$ref": "#/components/schemas/AnalyticsSummaryDto"
          },
          "through": {
            "format": "date",
            "type": "string"
          },
          "views": {
            "items": {
              "$ref": "#/components/schemas/AnalyticsViewDto"
            },
            "type": "array"
          }
        },
        "required": [
          "albums",
          "cameras",
          "days",
          "definitions",
          "from",
          "generatedAt",
          "history",
          "host",
          "metadata",
          "processing",
          "range",
          "scope",
          "scopeKind",
          "scopeLabel",
          "series",
          "summary",
          "through",
          "views"
        ],
        "type": "object"
      },
      "AnalyticsViewDto": {
        "properties": {
          "overlaps": {
            "description": "Also counted in another view",
            "type": "boolean"
          },
          "photos": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "total": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "videos": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "view": {
            "$ref": "#/components/schemas/AnalyticsView"
          }
        },
        "required": [
          "overlaps",
          "photos",
          "total",
          "videos",
          "view"
        ],
        "type": "object"
      },
      "AnalyticsView": {
        "enum": [
          "timeline",
          "favorites",
          "archive",
          "trash"
        ],
        "type": "string"
      },
      "AnalyticsSummaryDto": {
        "properties": {
          "duplicateReferences": {
            "description": "Items sharing an original file with another item in this selection",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "externalLogicalBytes": {
            "description": "Originals in external libraries, usually outside the library volume",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "externalPhysicalBytes": {
            "description": "Bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "files": {
            "description": "Original files, Live Photo motion parts included",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "items": {
            "description": "Photos and videos, Trash included, Locked media and Live Photo motion parts excluded",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "logicalBytes": {
            "description": "Every original reference, before physical deduplication",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "photos": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "physicalBytes": {
            "description": "Original files, each shared file counted once within this selection",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "raw": {
            "description": "RAW photos; a subset of photos",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "savedBytes": {
            "description": "logicalBytes minus physicalBytes of this same selection",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "unmeasuredFiles": {
            "description": "Original files whose size has not been read; excluded from byte totals",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "uploadedLogicalBytes": {
            "description": "Bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "uploadedPhysicalBytes": {
            "description": "Bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "videos": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "duplicateReferences",
          "externalLogicalBytes",
          "externalPhysicalBytes",
          "files",
          "items",
          "logicalBytes",
          "photos",
          "physicalBytes",
          "raw",
          "savedBytes",
          "unmeasuredFiles",
          "uploadedLogicalBytes",
          "uploadedPhysicalBytes",
          "videos"
        ],
        "type": "object"
      },
      "AnalyticsBucketDto": {
        "properties": {
          "completed": {
            "description": "Completed processing attempts; null when not available for this scope",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "failed": {
            "description": "Failed processing attempts; null when not available for this scope",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "from": {
            "format": "date",
            "type": "string"
          },
          "items": {
            "description": "Library items at the last observation in this period; null when none",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "key": {
            "description": "YYYY-MM for a month, the Monday for a week",
            "type": "string"
          },
          "logicalBytes": {
            "description": "Bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "observedAt": {
            "description": "When the growth values were read; null for a gap",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "partial": {
            "description": "Cut short by the edge of the selected dates",
            "type": "boolean"
          },
          "photos": {
            "description": "Photos added in this period and still in the library",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "physicalBytes": {
            "description": "Bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "through": {
            "format": "date",
            "type": "string"
          },
          "videos": {
            "description": "Videos added in this period and still in the library",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "completed",
          "failed",
          "from",
          "items",
          "key",
          "logicalBytes",
          "observedAt",
          "partial",
          "photos",
          "physicalBytes",
          "through",
          "videos"
        ],
        "type": "object"
      },
      "AnalyticsScopeKind": {
        "description": "Analytics scope kind",
        "enum": [
          "host",
          "account",
          "library"
        ],
        "type": "string"
      },
      "AnalyticsRange": {
        "description": "Analytics date range",
        "enum": [
          "90days",
          "year"
        ],
        "type": "string"
      },
      "AnalyticsProcessingDto": {
        "properties": {
          "attempts": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "available": {
            "description": "Processing is recorded for the whole server only",
            "type": "boolean"
          },
          "completed": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "costedAttempts": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "durationMs": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "estimatedCostUsd": {
            "description": "Estimate from configured hourly rates; never a bill. Null when no attempt had a rate",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "failed": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "uncostedAttempts": {
            "description": "Attempts without a configured rate; not included in the estimate",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "attempts",
          "available",
          "completed",
          "costedAttempts",
          "durationMs",
          "estimatedCostUsd",
          "failed",
          "uncostedAttempts"
        ],
        "type": "object"
      },
      "AnalyticsMetadataDto": {
        "properties": {
          "field": {
            "$ref": "#/components/schemas/AnalyticsMetadataField"
          },
          "missing": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "present": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "total": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "field",
          "missing",
          "present",
          "total"
        ],
        "type": "object"
      },
      "AnalyticsMetadataField": {
        "enum": [
          "captureDate",
          "location",
          "cameraModel",
          "aiDescription",
          "checksum"
        ],
        "type": "string"
      },
      "AnalyticsInsightsDto": {
        "properties": {
          "capturesByYear": {
            "description": "Items per local capture year, all time",
            "items": {
              "$ref": "#/components/schemas/AnalyticsYearCountDto"
            },
            "type": "array"
          },
          "coverage": {
            "$ref": "#/components/schemas/AnalyticsCoverageDto"
          },
          "focalLengths": {
            "description": "Every bucket, in order; adds up to summary.items",
            "items": {
              "$ref": "#/components/schemas/AnalyticsFocalLengthDto"
            },
            "type": "array"
          },
          "hdr": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AnalyticsHdrDto"
              }
            ],
            "description": "Null when no video stream has been read, so HDR cannot be told",
            "nullable": true
          },
          "hiddenItems": {
            "description": "Items this session keeps hidden (Locked people and tags, sensitive content). They are left out of every breakdown here, which adds up to summary.items minus hiddenItems (summary.photos and summary.videos likewise)",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "lenses": {
            "description": "Items per lens model, then every other lens, then no lens",
            "items": {
              "$ref": "#/components/schemas/AnalyticsNamedCountDto"
            },
            "type": "array"
          },
          "livePhotos": {
            "description": "Photos with a Live Photo motion part",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "orientation": {
            "description": "Every bucket; adds up to summary.items. Panorama is 2:1 or wider",
            "items": {
              "$ref": "#/components/schemas/AnalyticsOrientationDto"
            },
            "type": "array"
          },
          "peopleAndPlaces": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AnalyticsPeopleAndPlacesDto"
              }
            ],
            "nullable": true
          },
          "photoFormats": {
            "description": "Every format; adds up to summary.photos, and RAW equals summary.raw",
            "items": {
              "$ref": "#/components/schemas/AnalyticsPhotoFormatDto"
            },
            "type": "array"
          },
          "punchcard": {
            "description": "All 168 weekday and hour cells of the local capture time",
            "items": {
              "$ref": "#/components/schemas/AnalyticsPunchcardCellDto"
            },
            "type": "array"
          },
          "records": {
            "$ref": "#/components/schemas/AnalyticsRecordsDto"
          },
          "videoResolutions": {
            "description": "Every bucket; adds up to summary.videos",
            "items": {
              "$ref": "#/components/schemas/AnalyticsVideoResolutionDto"
            },
            "type": "array"
          }
        },
        "required": [
          "capturesByYear",
          "coverage",
          "focalLengths",
          "hdr",
          "hiddenItems",
          "lenses",
          "livePhotos",
          "orientation",
          "peopleAndPlaces",
          "photoFormats",
          "punchcard",
          "records",
          "videoResolutions"
        ],
        "type": "object"
      },
      "AnalyticsVideoResolutionDto": {
        "description": "Videos per resolution",
        "properties": {
          "count": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "key": {
            "$ref": "#/components/schemas/AnalyticsVideoResolutionDtoKey"
          }
        },
        "required": [
          "count",
          "key"
        ],
        "type": "object"
      },
      "AnalyticsVideoResolutionDtoKey": {
        "enum": [
          "4K",
          "1080p",
          "720p",
          "SD",
          "unknown"
        ],
        "type": "string"
      },
      "AnalyticsRecordsDto": {
        "properties": {
          "largestFile": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AnalyticsLargestFileDto"
              }
            ],
            "nullable": true
          },
          "longestVideo": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AnalyticsLongestVideoDto"
              }
            ],
            "nullable": true
          },
          "oldestCapture": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AnalyticsOldestCaptureDto"
              }
            ],
            "nullable": true
          },
          "videoDurationMs": {
            "description": "All videos together",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "videoHours": {
            "description": "videoDurationMs in hours, one decimal",
            "format": "double",
            "minimum": 0,
            "type": "number"
          }
        },
        "required": [
          "largestFile",
          "longestVideo",
          "oldestCapture",
          "videoDurationMs",
          "videoHours"
        ],
        "type": "object"
      },
      "AnalyticsOldestCaptureDto": {
        "properties": {
          "date": {
            "format": "date",
            "type": "string"
          },
          "name": {
            "description": "File name; null unless the owner reads their own scope",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "date",
          "name"
        ],
        "type": "object"
      },
      "AnalyticsLongestVideoDto": {
        "properties": {
          "durationMs": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "name": {
            "description": "File name; null unless the owner reads their own scope",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "durationMs",
          "name"
        ],
        "type": "object"
      },
      "AnalyticsLargestFileDto": {
        "properties": {
          "bytes": {
            "description": "Bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "name": {
            "description": "File name; null unless the owner reads their own scope",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "bytes",
          "name"
        ],
        "type": "object"
      },
      "AnalyticsPunchcardCellDto": {
        "properties": {
          "count": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "hour": {
            "description": "Hour of the local capture time",
            "maximum": 23,
            "minimum": 0,
            "type": "integer"
          },
          "weekday": {
            "description": "ISO weekday of the local capture time, 1 = Monday",
            "maximum": 7,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "count",
          "hour",
          "weekday"
        ],
        "type": "object"
      },
      "AnalyticsPhotoFormatDto": {
        "description": "Photos per original file format",
        "properties": {
          "count": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "key": {
            "$ref": "#/components/schemas/AnalyticsPhotoFormatDtoKey"
          }
        },
        "required": [
          "count",
          "key"
        ],
        "type": "object"
      },
      "AnalyticsPhotoFormatDtoKey": {
        "enum": [
          "HEIC",
          "JPEG",
          "RAW",
          "PNG",
          "OTHER"
        ],
        "type": "string"
      },
      "AnalyticsPeopleAndPlacesDto": {
        "description": "The owner's own people and places, only when the owner reads their own scope",
        "properties": {
          "cities": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "countries": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "faces": {
            "description": "Visible faces on the items",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "geotagged": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "itemsWithFaces": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "itemsWithoutFaces": {
            "description": "itemsWithFaces plus itemsWithoutFaces is summary.items minus hiddenItems",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "namedPeople": {
            "description": "Named, visible people of the owner seen on the items",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "pets": {
            "description": "The owner's visible pets confirmed on the items",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "places": {
            "description": "Items per city, then every other city, then no city",
            "items": {
              "$ref": "#/components/schemas/AnalyticsNamedCountDto"
            },
            "type": "array"
          },
          "topPeople": {
            "description": "Most photographed named people; overlapping, as one item can show several",
            "items": {
              "$ref": "#/components/schemas/AnalyticsPersonCountDto"
            },
            "type": "array"
          }
        },
        "required": [
          "cities",
          "countries",
          "faces",
          "geotagged",
          "itemsWithFaces",
          "itemsWithoutFaces",
          "namedPeople",
          "pets",
          "places",
          "topPeople"
        ],
        "type": "object"
      },
      "AnalyticsPersonCountDto": {
        "properties": {
          "count": {
            "description": "Items showing them",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "id": {
            "description": "Person id",
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "count",
          "id",
          "name"
        ],
        "type": "object"
      },
      "AnalyticsNamedCountDto": {
        "properties": {
          "count": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "kind": {
            "$ref": "#/components/schemas/AnalyticsNamedCountKind"
          },
          "name": {
            "description": "Null for the other and unknown rows",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "count",
          "kind",
          "name"
        ],
        "type": "object"
      },
      "AnalyticsNamedCountKind": {
        "enum": [
          "named",
          "other",
          "unknown"
        ],
        "type": "string"
      },
      "AnalyticsOrientationDto": {
        "description": "Items per displayed orientation",
        "properties": {
          "count": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "key": {
            "$ref": "#/components/schemas/AnalyticsOrientationDtoKey"
          }
        },
        "required": [
          "count",
          "key"
        ],
        "type": "object"
      },
      "AnalyticsOrientationDtoKey": {
        "enum": [
          "landscape",
          "portrait",
          "square",
          "panorama",
          "unknown"
        ],
        "type": "string"
      },
      "AnalyticsHdrDto": {
        "properties": {
          "dolbyVisionVideos": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "hdrVideos": {
            "description": "PQ or HLG transfer, or Dolby Vision",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "probedVideos": {
            "description": "Videos whose stream metadata has been read; the only ones HDR can be told for",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "dolbyVisionVideos",
          "hdrVideos",
          "probedVideos"
        ],
        "type": "object"
      },
      "AnalyticsFocalLengthDto": {
        "description": "Items per recorded focal length (mm)",
        "properties": {
          "count": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "key": {
            "$ref": "#/components/schemas/AnalyticsFocalLengthDtoKey"
          }
        },
        "required": [
          "count",
          "key"
        ],
        "type": "object"
      },
      "AnalyticsFocalLengthDtoKey": {
        "enum": [
          "0-16",
          "17-28",
          "29-40",
          "41-70",
          "71-135",
          "136-300",
          "301+",
          "unknown"
        ],
        "type": "string"
      },
      "AnalyticsCoverageDto": {
        "description": "Out of summary.items minus hiddenItems",
        "properties": {
          "facesChecked": {
            "description": "Items face detection has run on",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "searchIndexed": {
            "description": "Items with a smart-search embedding",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "facesChecked",
          "searchIndexed"
        ],
        "type": "object"
      },
      "AnalyticsYearCountDto": {
        "properties": {
          "count": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "year": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "count",
          "year"
        ],
        "type": "object"
      },
      "AnalyticsHostDto": {
        "description": "The library volume, always the whole host whatever is selected",
        "properties": {
          "breakdown": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AnalyticsVolumeBreakdownDto"
              }
            ],
            "nullable": true
          },
          "capacityBytes": {
            "description": "Bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "freeBytes": {
            "description": "Bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "observedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/AnalyticsState"
          },
          "volumeUsedBytes": {
            "description": "Bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "capacityBytes",
          "freeBytes",
          "observedAt",
          "state",
          "volumeUsedBytes"
        ],
        "type": "object"
      },
      "AnalyticsState": {
        "description": "Analytics reading state",
        "enum": [
          "measured",
          "stale",
          "unknown"
        ],
        "type": "string"
      },
      "AnalyticsVolumeBreakdownDto": {
        "description": "What uses the library volume, only in the whole-server report; the parts and otherBytes add up to volumeUsedBytes",
        "properties": {
          "databaseBytes": {
            "description": "This server database on disk (pg_database_size)",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "encodedVideoBytes": {
            "description": "Encoded video folder, from the nightly collector; null before its first reading",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "exceedsUsed": {
            "description": "The measured parts add up to more than the volume used, for example a database on another disk; otherBytes is then 0",
            "type": "boolean"
          },
          "generatedObservedAt": {
            "description": "When the generated folders were last measured",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "onOtherDisk": {
            "description": "Generated folders the collector found on another disk than the library; not part of volumeUsedBytes",
            "items": {
              "$ref": "#/components/schemas/AnalyticsVolumePart"
            },
            "type": "array"
          },
          "originalsBytes": {
            "description": "Uploaded original files on the volume, each shared file counted once (Locked excluded)",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "otherBytes": {
            "description": "volumeUsedBytes minus every measured part: other files on the volume, Locked originals and anything unmeasured",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "previewsBytes": {
            "description": "Thumbnail and preview folder, from the nightly collector; null before its first reading",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "databaseBytes",
          "encodedVideoBytes",
          "exceedsUsed",
          "generatedObservedAt",
          "onOtherDisk",
          "originalsBytes",
          "otherBytes",
          "previewsBytes"
        ],
        "type": "object"
      },
      "AnalyticsVolumePart": {
        "enum": [
          "previews",
          "encodedVideo"
        ],
        "type": "string"
      },
      "AnalyticsHistoryDto": {
        "properties": {
          "dayRetentionDays": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "lastObservedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "staleAfterHours": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "state": {
            "$ref": "#/components/schemas/AnalyticsState",
            "description": "unknown: never collected; stale: last collection is too old"
          },
          "weekRetentionDays": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "dayRetentionDays",
          "lastObservedAt",
          "staleAfterHours",
          "state",
          "weekRetentionDays"
        ],
        "type": "object"
      },
      "AnalyticsSeriesDefinitionDto": {
        "properties": {
          "available": {
            "description": "Whether this report carries the series for the selected scope",
            "type": "boolean"
          },
          "collected": {
            "description": "Written by the local nightly collector rather than read live",
            "type": "boolean"
          },
          "estimate": {
            "description": "An estimate, never a charge",
            "type": "boolean"
          },
          "grain": {
            "$ref": "#/components/schemas/AnalyticsGrain"
          },
          "id": {
            "$ref": "#/components/schemas/AnalyticsSeriesId"
          },
          "measurementScope": {
            "$ref": "#/components/schemas/AnalyticsMeasurementScope"
          },
          "owner": {
            "$ref": "#/components/schemas/AnalyticsSeriesOwner"
          },
          "scopes": {
            "description": "Selections the series can be read for",
            "items": {
              "$ref": "#/components/schemas/AnalyticsScopeKind"
            },
            "type": "array"
          },
          "source": {
            "description": "Where the number comes from",
            "type": "string"
          },
          "unit": {
            "$ref": "#/components/schemas/AnalyticsUnit"
          }
        },
        "required": [
          "available",
          "collected",
          "estimate",
          "grain",
          "id",
          "measurementScope",
          "owner",
          "scopes",
          "source",
          "unit"
        ],
        "type": "object"
      },
      "AnalyticsUnit": {
        "description": "Analytics unit",
        "enum": [
          "items",
          "bytes",
          "attempts",
          "usd"
        ],
        "type": "string"
      },
      "AnalyticsSeriesOwner": {
        "description": "The part of the product that answers for it",
        "enum": [
          "library",
          "host",
          "processing"
        ],
        "type": "string"
      },
      "AnalyticsMeasurementScope": {
        "description": "Analytics measurement scope",
        "enum": [
          "selection",
          "host"
        ],
        "type": "string"
      },
      "AnalyticsSeriesId": {
        "description": "Approved analytics series",
        "enum": [
          "library.items",
          "library.photos",
          "library.videos",
          "library.logicalBytes",
          "library.physicalBytes",
          "host.volumeUsedBytes",
          "host.capacityBytes",
          "host.thumbnailBytes",
          "host.encodedVideoBytes",
          "host.thumbnailOtherDiskBytes",
          "host.encodedVideoOtherDiskBytes",
          "library.arrivals",
          "library.captures",
          "processing.completed",
          "processing.failed",
          "processing.estimatedCostUsd"
        ],
        "type": "string"
      },
      "AnalyticsGrain": {
        "description": "Analytics grain",
        "enum": [
          "snapshot",
          "day"
        ],
        "type": "string"
      },
      "AnalyticsDayDto": {
        "properties": {
          "captured": {
            "description": "Items taken on this local date",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "date": {
            "format": "date",
            "type": "string"
          },
          "uploaded": {
            "description": "Items added on this UTC date",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "captured",
          "date",
          "uploaded"
        ],
        "type": "object"
      },
      "AnalyticsCameraDto": {
        "properties": {
          "count": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "kind": {
            "$ref": "#/components/schemas/AnalyticsCameraKind"
          },
          "name": {
            "description": "Camera model; null for the other and unknown rows",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "count",
          "kind",
          "name"
        ],
        "type": "object"
      },
      "AnalyticsCameraKind": {
        "enum": [
          "model",
          "other",
          "unknown"
        ],
        "type": "string"
      },
      "AnalyticsAlbumsDto": {
        "properties": {
          "albums": {
            "description": "Albums the viewer owns or belongs to",
            "items": {
              "$ref": "#/components/schemas/AnalyticsAlbumDto"
            },
            "type": "array"
          },
          "notShared": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "owned": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "ownedShared": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "shared": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "total": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "unlisted": {
            "description": "Albums counted but not listed, because the viewer neither owns nor belongs to them",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "albums",
          "notShared",
          "owned",
          "ownedShared",
          "shared",
          "total",
          "unlisted"
        ],
        "type": "object"
      },
      "AnalyticsAlbumDto": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "owned": {
            "type": "boolean"
          },
          "ownerName": {
            "type": "string"
          },
          "shared": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "name",
          "owned",
          "ownerName",
          "shared"
        ],
        "type": "object"
      },
      "AnalyticsScopesResponseDto": {
        "properties": {
          "scopes": {
            "items": {
              "$ref": "#/components/schemas/AnalyticsScopeOptionDto"
            },
            "type": "array"
          }
        },
        "required": [
          "scopes"
        ],
        "type": "object"
      },
      "AnalyticsScopeOptionDto": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/AnalyticsScopeKind"
          },
          "label": {
            "description": "Account or library name; empty for the whole server",
            "type": "string"
          },
          "libraryId": {
            "nullable": true,
            "type": "string"
          },
          "removed": {
            "description": "The account or library has been removed; its items may still count until deleted",
            "type": "boolean"
          },
          "userId": {
            "description": "The account, or the library owner",
            "nullable": true,
            "type": "string"
          },
          "value": {
            "description": "The value to pass as `scope`",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "label",
          "libraryId",
          "removed",
          "userId",
          "value"
        ],
        "type": "object"
      },
      "ArchiveOperationResponseDto": {
        "properties": {
          "archiveJobId": {
            "description": "The durable bulk job that archives the frozen set",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "archived": {
            "description": "Archived by this operation and not undone",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "conflict": {
            "description": "Changed after the archive, so Undo left them as they are",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "count": {
            "description": "Assets frozen into this operation",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "currentSession": {
            "description": "The operation was submitted or confirmed from the session asking, so it may offer its Undo",
            "type": "boolean"
          },
          "expiresAt": {
            "description": "When an unconfirmed prepared selection stops being confirmable",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "Archive operation ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "pending": {
            "description": "Not reached yet",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "prepared": {
            "description": "Counted and frozen, waiting for the owner to confirm; nothing has changed yet",
            "type": "boolean"
          },
          "requestKey": {
            "description": "The request key the operation was created with",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "scope": {
            "$ref": "#/components/schemas/ArchiveOperationScope"
          },
          "skipped": {
            "description": "Left as they were: no longer in the Timeline, or stopped before they were reached",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "undoJobId": {
            "description": "The durable bulk job that undoes it, once requested",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "undoable": {
            "description": "Undo is available for this operation",
            "type": "boolean"
          },
          "undone": {
            "description": "Restored by Undo",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "archiveJobId",
          "archived",
          "conflict",
          "count",
          "createdAt",
          "currentSession",
          "expiresAt",
          "id",
          "pending",
          "prepared",
          "requestKey",
          "scope",
          "skipped",
          "undoJobId",
          "undoable",
          "undone"
        ],
        "type": "object"
      },
      "ArchiveOperationScope": {
        "description": "What an archive operation covers",
        "enum": [
          "selected-owned-assets",
          "matching-owned-timeline"
        ],
        "type": "string"
      },
      "ArchiveOperationCreateDto": {
        "additionalProperties": false,
        "properties": {
          "assetIds": {
            "description": "The selection, in order",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 50000,
            "minItems": 1,
            "type": "array"
          },
          "requestKey": {
            "description": "Client idempotency key; the same key answers with the same operation instead of starting another",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "assetIds",
          "requestKey"
        ],
        "type": "object"
      },
      "ArchiveOperationPrepareDto": {
        "additionalProperties": false,
        "properties": {
          "requestKey": {
            "description": "Client idempotency key; the same key answers with the same operation instead of starting another",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "scope": {
            "$ref": "#/components/schemas/ArchiveOperationPrepareScope"
          }
        },
        "required": [
          "requestKey",
          "scope"
        ],
        "type": "object"
      },
      "ArchiveOperationPrepareScope": {
        "description": "Only the owner’s own normal Timeline can be prepared on the server",
        "enum": [
          "matching-owned-timeline"
        ],
        "type": "string"
      },
      "ArchiveOperationConfirmDto": {
        "additionalProperties": false,
        "properties": {
          "requestKey": {
            "description": "The request key the selection was prepared with",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "requestKey"
        ],
        "type": "object"
      },
      "ArchiveOperationUndoDto": {
        "additionalProperties": false,
        "properties": {
          "requestKey": {
            "description": "Client idempotency key; the same key answers with the same operation instead of starting another",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "requestKey"
        ],
        "type": "object"
      },
      "AssetFileResponseDto": {
        "properties": {
          "createdAt": {
            "description": "Creation date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "id": {
            "description": "Asset file ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isEdited": {
            "description": "The file was generated from an edit",
            "type": "boolean"
          },
          "isProgressive": {
            "description": "The file is a progressively encoded JPEG",
            "type": "boolean"
          },
          "isTransparent": {
            "description": "The file is transparent",
            "type": "boolean"
          },
          "path": {
            "description": "File path",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/AssetFileType"
          },
          "updatedAt": {
            "description": "Update date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          }
        },
        "required": [
          "createdAt",
          "id",
          "isEdited",
          "isProgressive",
          "isTransparent",
          "path",
          "type",
          "updatedAt"
        ],
        "type": "object"
      },
      "AssetFileType": {
        "description": "Type of file",
        "enum": [
          "fullsize",
          "preview",
          "thumbnail",
          "sidecar",
          "encoded_video"
        ],
        "type": "string"
      },
      "AssetBulkDeleteDto": {
        "properties": {
          "force": {
            "description": "Force delete even if in use",
            "type": "boolean"
          },
          "ids": {
            "description": "IDs to process",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "ids"
        ],
        "type": "object"
      },
      "AssetMediaResponseDto": {
        "properties": {
          "id": {
            "description": "Asset media ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/AssetMediaStatus"
          }
        },
        "required": [
          "id",
          "status"
        ],
        "type": "object"
      },
      "AssetMediaStatus": {
        "description": "Upload status",
        "enum": [
          "created",
          "duplicate"
        ],
        "type": "string"
      },
      "AssetMediaCreateDto": {
        "properties": {
          "assetData": {
            "description": "Asset file data",
            "format": "binary",
            "type": "string"
          },
          "duration": {
            "description": "Duration in milliseconds (for videos)",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "fileCreatedAt": {
            "description": "File creation date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "fileModifiedAt": {
            "description": "File modification date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "filename": {
            "description": "Filename",
            "type": "string"
          },
          "isFavorite": {
            "description": "Mark as favorite",
            "type": "boolean"
          },
          "livePhotoVideoId": {
            "description": "Live photo video ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "metadata": {
            "description": "Asset metadata items",
            "items": {
              "$ref": "#/components/schemas/AssetMetadataUpsertItemDto"
            },
            "type": "array"
          },
          "sidecarData": {
            "description": "Sidecar file data",
            "format": "binary",
            "type": "string"
          },
          "visibility": {
            "$ref": "#/components/schemas/AssetVisibility"
          }
        },
        "required": [
          "assetData",
          "fileCreatedAt",
          "fileModifiedAt"
        ],
        "type": "object"
      },
      "AssetMetadataUpsertItemDto": {
        "properties": {
          "key": {
            "description": "Metadata key",
            "type": "string"
          },
          "value": {
            "additionalProperties": {},
            "description": "Metadata value (object)",
            "type": "object"
          }
        },
        "required": [
          "key",
          "value"
        ],
        "type": "object"
      },
      "AssetBulkUpdateDto": {
        "properties": {
          "dateTimeOriginal": {
            "description": "Original date and time",
            "type": "string"
          },
          "dateTimeRelative": {
            "description": "Relative time offset in minutes",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "description": {
            "description": "Asset description",
            "type": "string"
          },
          "duplicateId": {
            "description": "Duplicate ID",
            "nullable": true,
            "type": "string"
          },
          "ids": {
            "description": "Asset IDs to update",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "isFavorite": {
            "description": "Mark as favorite",
            "type": "boolean"
          },
          "latitude": {
            "description": "Latitude coordinate; null together with a null longitude removes the location",
            "format": "double",
            "maximum": 90,
            "minimum": -90,
            "nullable": true,
            "type": "number"
          },
          "longitude": {
            "description": "Longitude coordinate; null together with a null latitude removes the location",
            "format": "double",
            "maximum": 180,
            "minimum": -180,
            "nullable": true,
            "type": "number"
          },
          "rating": {
            "description": "Rating in range [1-5] (starred), -1 (rejected), or null (unrated)",
            "maximum": 5,
            "minimum": -1,
            "nullable": true,
            "type": "integer"
          },
          "timeZone": {
            "description": "Time zone (IANA timezone)",
            "type": "string"
          },
          "visibility": {
            "$ref": "#/components/schemas/AssetVisibility"
          }
        },
        "required": [
          "ids"
        ],
        "type": "object"
      },
      "AssetBulkUploadCheckResponseDto": {
        "properties": {
          "results": {
            "description": "Upload check results",
            "items": {
              "$ref": "#/components/schemas/AssetBulkUploadCheckResult"
            },
            "type": "array"
          }
        },
        "required": [
          "results"
        ],
        "type": "object"
      },
      "AssetBulkUploadCheckResult": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/AssetUploadAction"
          },
          "assetId": {
            "description": "Existing asset ID if duplicate",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "id": {
            "description": "Client-side identifier echoed from the request to match results to inputs",
            "type": "string"
          },
          "isTrashed": {
            "description": "Whether existing asset is trashed",
            "type": "boolean"
          },
          "reason": {
            "$ref": "#/components/schemas/AssetRejectReason"
          }
        },
        "required": [
          "action",
          "id"
        ],
        "type": "object"
      },
      "AssetRejectReason": {
        "description": "Rejection reason if rejected",
        "enum": [
          "duplicate",
          "unsupported-format"
        ],
        "type": "string"
      },
      "AssetUploadAction": {
        "description": "Upload action",
        "enum": [
          "accept",
          "reject"
        ],
        "type": "string"
      },
      "AssetBulkUploadCheckDto": {
        "properties": {
          "assets": {
            "description": "Assets to check",
            "items": {
              "$ref": "#/components/schemas/AssetBulkUploadCheckItem"
            },
            "type": "array"
          }
        },
        "required": [
          "assets"
        ],
        "type": "object"
      },
      "AssetBulkUploadCheckItem": {
        "properties": {
          "checksum": {
            "description": "Base64 or hex encoded checksum. SHA-256 (32 bytes / 64 hex / 44 base64) for new uploads; SHA-1 (20 bytes / 40 hex / 28 base64) accepted for legacy assets.",
            "type": "string"
          },
          "id": {
            "description": "Client-side identifier echoed in the response to match results to inputs (e.g. filename)",
            "type": "string"
          }
        },
        "required": [
          "checksum",
          "id"
        ],
        "type": "object"
      },
      "AssetCopyDto": {
        "properties": {
          "albums": {
            "default": true,
            "description": "Copy album associations",
            "type": "boolean"
          },
          "favorite": {
            "default": true,
            "description": "Copy favorite status",
            "type": "boolean"
          },
          "sharedLinks": {
            "default": true,
            "description": "Copy shared links",
            "type": "boolean"
          },
          "sidecar": {
            "default": true,
            "description": "Copy sidecar file",
            "type": "boolean"
          },
          "sourceId": {
            "description": "Source asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "stack": {
            "default": true,
            "description": "Copy stack association",
            "type": "boolean"
          },
          "targetId": {
            "description": "Target asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "sourceId",
          "targetId"
        ],
        "type": "object"
      },
      "AssetJobsDto": {
        "properties": {
          "assetIds": {
            "description": "Asset IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "name": {
            "$ref": "#/components/schemas/AssetJobName"
          }
        },
        "required": [
          "assetIds",
          "name"
        ],
        "type": "object"
      },
      "AssetJobName": {
        "description": "Job name",
        "enum": [
          "refresh-faces",
          "refresh-metadata",
          "refresh-ocr",
          "regenerate-thumbnail",
          "transcode-video"
        ],
        "type": "string"
      },
      "AssetMetadataBulkDeleteDto": {
        "properties": {
          "items": {
            "description": "Metadata items to delete",
            "items": {
              "$ref": "#/components/schemas/AssetMetadataBulkDeleteItemDto"
            },
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "AssetMetadataBulkDeleteItemDto": {
        "properties": {
          "assetId": {
            "description": "Asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "key": {
            "description": "Metadata key",
            "type": "string"
          }
        },
        "required": [
          "assetId",
          "key"
        ],
        "type": "object"
      },
      "AssetMetadataBulkResponseDto": {
        "properties": {
          "assetId": {
            "description": "Asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "key": {
            "description": "Metadata key",
            "type": "string"
          },
          "updatedAt": {
            "description": "Last update date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "value": {
            "additionalProperties": {},
            "description": "Metadata value (object)",
            "type": "object"
          }
        },
        "required": [
          "assetId",
          "key",
          "updatedAt",
          "value"
        ],
        "type": "object"
      },
      "AssetMetadataBulkUpsertDto": {
        "properties": {
          "items": {
            "description": "Metadata items to upsert",
            "items": {
              "$ref": "#/components/schemas/AssetMetadataBulkUpsertItemDto"
            },
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "AssetMetadataBulkUpsertItemDto": {
        "properties": {
          "assetId": {
            "description": "Asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "key": {
            "description": "Metadata key",
            "type": "string"
          },
          "value": {
            "additionalProperties": {},
            "description": "Metadata value (object)",
            "type": "object"
          }
        },
        "required": [
          "assetId",
          "key",
          "value"
        ],
        "type": "object"
      },
      "AssetUploadResultDto": {
        "properties": {
          "id": {
            "description": "Created or duplicate asset ID; nil UUID if current privacy suppresses it",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "sha256": {
            "description": "Verified SHA-256 of the complete uploaded representation",
            "pattern": "^[a-f0-9]{64}$",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/AssetMediaStatus"
          }
        },
        "required": [
          "id",
          "sha256",
          "status"
        ],
        "type": "object"
      },
      "LivePhotoUploadResultDto": {
        "properties": {
          "still": {
            "$ref": "#/components/schemas/AssetUploadResultDto"
          },
          "video": {
            "$ref": "#/components/schemas/AssetUploadResultDto"
          }
        },
        "required": [
          "still",
          "video"
        ],
        "type": "object"
      },
      "LivePhotoUploadCommitDto": {
        "properties": {
          "stillResourceId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "videoResourceId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          }
        },
        "required": [
          "stillResourceId",
          "videoResourceId"
        ],
        "type": "object"
      },
      "AssetResponseDto": {
        "properties": {
          "checksum": {
            "description": "Base64-encoded file checksum. SHA-256 (44 chars) for assets uploaded after the SHA-256 transition; SHA-1 (28 chars) for legacy assets. Use the asset `checksumAlgorithm` field to disambiguate when length-based detection is insufficient.",
            "type": "string"
          },
          "createdAt": {
            "description": "The UTC timestamp when the asset was originally uploaded to Frameleaf.",
            "format": "date-time",
            "type": "string"
          },
          "duplicateId": {
            "description": "Duplicate group ID",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "duration": {
            "description": "Video/gif duration in milliseconds (null for static images)",
            "maximum": 2147483647,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "exifInfo": {
            "$ref": "#/components/schemas/ExifResponseDto"
          },
          "fileCreatedAt": {
            "description": "The actual UTC timestamp when the file was created/captured, preserving timezone information. This is the authoritative timestamp for chronological sorting within timeline groups. Combined with timezone data, this can be used to determine the exact moment the photo was taken.",
            "format": "date-time",
            "type": "string"
          },
          "fileModifiedAt": {
            "description": "The UTC timestamp when the file was last modified on the filesystem. This reflects the last time the physical file was changed, which may be different from when the photo was originally taken.",
            "format": "date-time",
            "type": "string"
          },
          "hasMetadata": {
            "description": "Whether asset has metadata",
            "type": "boolean"
          },
          "height": {
            "description": "Asset height",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "id": {
            "description": "Asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isArchived": {
            "description": "Is archived",
            "type": "boolean"
          },
          "isEdited": {
            "description": "Is edited",
            "type": "boolean"
          },
          "isFavorite": {
            "description": "Is favorite",
            "type": "boolean"
          },
          "isOffline": {
            "description": "Is offline",
            "type": "boolean"
          },
          "isTrashed": {
            "description": "Is trashed",
            "type": "boolean"
          },
          "libraryId": {
            "description": "Library ID",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "livePhotoVideoId": {
            "description": "Live photo video ID",
            "nullable": true,
            "type": "string"
          },
          "localDateTime": {
            "description": "The local date and time when the photo/video was taken, derived from EXIF metadata. This represents the photographer's local time regardless of timezone, stored as a timezone-agnostic timestamp. Used for timeline grouping by \"local\" days and months.",
            "format": "date-time",
            "type": "string"
          },
          "origin": {
            "$ref": "#/components/schemas/PartnerOriginDto",
            "description": "present on your own asset when partner sharing copied it from another library (GET /assets/{id})"
          },
          "originalFileName": {
            "description": "Original file name",
            "type": "string"
          },
          "originalMimeType": {
            "description": "Original MIME type",
            "type": "string"
          },
          "originalPath": {
            "description": "Original file path",
            "type": "string"
          },
          "owner": {
            "$ref": "#/components/schemas/UserResponseDto"
          },
          "ownerId": {
            "description": "Owner user ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "people": {
            "items": {
              "$ref": "#/components/schemas/PersonResponseDto"
            },
            "type": "array"
          },
          "resized": {
            "description": "Is resized",
            "type": "boolean"
          },
          "stack": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AssetStackResponseDto"
              }
            ],
            "nullable": true
          },
          "tags": {
            "items": {
              "$ref": "#/components/schemas/TagResponseDto"
            },
            "type": "array"
          },
          "thumbhash": {
            "description": "Thumbhash for thumbnail generation (base64) also used as the c query param for thumbnail cache busting.",
            "nullable": true,
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/AssetTypeEnum"
          },
          "updatedAt": {
            "description": "The UTC timestamp when the asset record was last updated in the database. This is automatically maintained by the database and reflects when any field in the asset was last modified.",
            "format": "date-time",
            "type": "string"
          },
          "visibility": {
            "$ref": "#/components/schemas/AssetVisibility"
          },
          "width": {
            "description": "Asset width",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "checksum",
          "createdAt",
          "duration",
          "fileCreatedAt",
          "fileModifiedAt",
          "hasMetadata",
          "height",
          "id",
          "isArchived",
          "isEdited",
          "isFavorite",
          "isOffline",
          "isTrashed",
          "localDateTime",
          "originalFileName",
          "originalPath",
          "ownerId",
          "thumbhash",
          "type",
          "updatedAt",
          "visibility",
          "width"
        ],
        "type": "object"
      },
      "TagResponseDto": {
        "properties": {
          "color": {
            "description": "Tag color (hex)",
            "type": "string"
          },
          "createdAt": {
            "description": "Creation date",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "Tag ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "description": "Tag name",
            "type": "string"
          },
          "parentId": {
            "description": "Parent tag ID",
            "type": "string"
          },
          "updatedAt": {
            "description": "Last update date",
            "format": "date-time",
            "type": "string"
          },
          "value": {
            "description": "Tag value (full path)",
            "type": "string"
          }
        },
        "required": [
          "createdAt",
          "id",
          "name",
          "updatedAt",
          "value"
        ],
        "type": "object"
      },
      "AssetStackResponseDto": {
        "properties": {
          "assetCount": {
            "description": "Number of assets in stack",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "id": {
            "description": "Stack ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "primaryAssetId": {
            "description": "Primary asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "assetCount",
          "id",
          "primaryAssetId"
        ],
        "type": "object"
      },
      "PersonResponseDto": {
        "properties": {
          "birthDate": {
            "description": "Person date of birth",
            "format": "date",
            "nullable": true,
            "type": "string"
          },
          "color": {
            "description": "Person color (hex)",
            "type": "string"
          },
          "featuredAssetId": {
            "description": "The photo the person's featured face is in (). Returned only to the person's owner, by GET and PUT /people/:id; null when there is none, when it is another account's photo, or when it may not be shown (trashed, hidden, Locked, a removed or invisible face, or hidden as NSFW)",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "id": {
            "description": "Person ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isFavorite": {
            "description": "Is favorite",
            "type": "boolean"
          },
          "isHidden": {
            "description": "Is hidden",
            "type": "boolean"
          },
          "name": {
            "description": "Person name",
            "type": "string"
          },
          "thumbnailPath": {
            "description": "Thumbnail path",
            "type": "string"
          },
          "updatedAt": {
            "description": "Last update date",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "birthDate",
          "id",
          "isHidden",
          "name",
          "thumbnailPath"
        ],
        "type": "object"
      },
      "ExifResponseDto": {
        "description": "EXIF response",
        "properties": {
          "bitsPerSample": {
            "default": null,
            "description": "Bits per sample",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "city": {
            "default": null,
            "description": "City name",
            "nullable": true,
            "type": "string"
          },
          "colorspace": {
            "default": null,
            "description": "Recorded color space",
            "nullable": true,
            "type": "string"
          },
          "country": {
            "default": null,
            "description": "Country name",
            "nullable": true,
            "type": "string"
          },
          "dateTimeOriginal": {
            "default": null,
            "description": "Original date/time",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "description": {
            "default": null,
            "description": "Image description",
            "nullable": true,
            "type": "string"
          },
          "exifImageHeight": {
            "default": null,
            "description": "Image height in pixels",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "exifImageWidth": {
            "default": null,
            "description": "Image width in pixels",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "exposureTime": {
            "default": null,
            "description": "Exposure time",
            "nullable": true,
            "type": "string"
          },
          "fNumber": {
            "default": null,
            "description": "F-number (aperture)",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "fileSizeInByte": {
            "default": null,
            "description": "File size in bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "focalLength": {
            "default": null,
            "description": "Focal length in mm",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "fps": {
            "default": null,
            "description": "Video frame rate (frames per second)",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "isRejected": {
            "default": null,
            "description": "Whether the stored rating is rejected",
            "nullable": true,
            "type": "boolean"
          },
          "iso": {
            "default": null,
            "description": "ISO sensitivity",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "latitude": {
            "default": null,
            "description": "GPS latitude",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "lensModel": {
            "default": null,
            "description": "Lens model",
            "nullable": true,
            "type": "string"
          },
          "longitude": {
            "default": null,
            "description": "GPS longitude",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "make": {
            "default": null,
            "description": "Camera make",
            "nullable": true,
            "type": "string"
          },
          "model": {
            "default": null,
            "description": "Camera model",
            "nullable": true,
            "type": "string"
          },
          "modifyDate": {
            "default": null,
            "description": "Modification date/time",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "orientation": {
            "default": null,
            "description": "Image orientation",
            "nullable": true,
            "type": "string"
          },
          "profileDescription": {
            "default": null,
            "description": "Color profile description",
            "nullable": true,
            "type": "string"
          },
          "projectionType": {
            "default": null,
            "description": "Projection type",
            "nullable": true,
            "type": "string"
          },
          "rating": {
            "default": null,
            "description": "Rating",
            "maximum": 5,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "state": {
            "default": null,
            "description": "State/province name",
            "nullable": true,
            "type": "string"
          },
          "timeZone": {
            "default": null,
            "description": "Time zone",
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "UpdateAssetDto": {
        "properties": {
          "city": {
            "description": "City name; kept over reverse geocoding until the item is moved again",
            "maxLength": 255,
            "nullable": true,
            "type": "string"
          },
          "country": {
            "description": "Country name; kept over reverse geocoding until the item is moved again",
            "maxLength": 255,
            "nullable": true,
            "type": "string"
          },
          "dateTimeOriginal": {
            "description": "Original date and time",
            "type": "string"
          },
          "description": {
            "description": "Asset description",
            "type": "string"
          },
          "isFavorite": {
            "description": "Mark as favorite",
            "type": "boolean"
          },
          "latitude": {
            "description": "Latitude coordinate; null together with a null longitude removes the location",
            "format": "double",
            "maximum": 90,
            "minimum": -90,
            "nullable": true,
            "type": "number"
          },
          "livePhotoVideoId": {
            "description": "Live photo video ID",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "longitude": {
            "description": "Longitude coordinate; null together with a null latitude removes the location",
            "format": "double",
            "maximum": 180,
            "minimum": -180,
            "nullable": true,
            "type": "number"
          },
          "rating": {
            "description": "Rating in range [1-5] (starred), -1 (rejected), or null (unrated)",
            "maximum": 5,
            "minimum": -1,
            "nullable": true,
            "type": "integer"
          },
          "state": {
            "description": "State or region name; kept over reverse geocoding until the item is moved again",
            "maxLength": 255,
            "nullable": true,
            "type": "string"
          },
          "visibility": {
            "$ref": "#/components/schemas/AssetVisibility"
          }
        },
        "type": "object"
      },
      "AssetDevelopResponseDto": {
        "properties": {
          "assetId": {
            "description": "Asset ID these revisions belong to",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "currentRevisionId": {
            "description": "The revision the asset currently shows; null means the original",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revisions": {
            "description": "Every saved version of the recipe, newest first",
            "items": {
              "$ref": "#/components/schemas/AssetDevelopRevisionResponseDto"
            },
            "type": "array"
          }
        },
        "required": [
          "assetId",
          "currentRevisionId",
          "revisions"
        ],
        "type": "object"
      },
      "AssetDevelopRevisionResponseDto": {
        "properties": {
          "assetId": {
            "description": "Asset this revision belongs to",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "attempts": {
            "description": "Render attempts so far; one automatic retry follows a first failure",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "createdAt": {
            "description": "When the version was saved",
            "format": "date-time",
            "type": "string"
          },
          "error": {
            "description": "Why the last render failed, when it did",
            "nullable": true,
            "type": "string"
          },
          "exportId": {
            "description": "The export of the original an imported version was developed from",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "fileName": {
            "description": "Name of the imported file, for a version developed elsewhere",
            "nullable": true,
            "type": "string"
          },
          "hasMaster": {
            "description": "True once the edited master file exists",
            "type": "boolean"
          },
          "hasPreview": {
            "description": "True once the preview file exists",
            "type": "boolean"
          },
          "height": {
            "description": "Height of the edited master in pixels",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "id": {
            "description": "Develop revision ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isCurrent": {
            "description": "True for the version the asset currently shows",
            "type": "boolean"
          },
          "kind": {
            "$ref": "#/components/schemas/AssetDevelopRevisionKind"
          },
          "label": {
            "description": "Name given when the version was saved",
            "nullable": true,
            "type": "string"
          },
          "progress": {
            "description": "Render progress as a percentage",
            "maximum": 100,
            "minimum": 0,
            "type": "integer"
          },
          "recipe": {
            "$ref": "#/components/schemas/AssetDevelopRecipeDto"
          },
          "renderedAt": {
            "description": "When the render finished",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "rendererVersion": {
            "description": "Identity of the renderer that produced the files, for lineage",
            "nullable": true,
            "type": "string"
          },
          "renditionChecksum": {
            "description": "SHA-256 (hex) of the edited master file, once it exists",
            "nullable": true,
            "type": "string"
          },
          "revision": {
            "description": "Per-asset sequence number, 1 for the first saved version",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "software": {
            "description": "Application an imported version was developed with, when known",
            "nullable": true,
            "type": "string"
          },
          "sourceChecksum": {
            "description": "SHA-256 (hex) of the original this version was rendered or developed from",
            "nullable": true,
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/AssetDevelopRevisionStatus"
          },
          "updatedAt": {
            "description": "When the revision last changed",
            "format": "date-time",
            "type": "string"
          },
          "width": {
            "description": "Width of the edited master in pixels",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "assetId",
          "attempts",
          "createdAt",
          "error",
          "exportId",
          "fileName",
          "hasMaster",
          "hasPreview",
          "height",
          "id",
          "isCurrent",
          "kind",
          "label",
          "progress",
          "recipe",
          "renderedAt",
          "rendererVersion",
          "renditionChecksum",
          "revision",
          "software",
          "sourceChecksum",
          "status",
          "updatedAt",
          "width"
        ],
        "type": "object"
      },
      "AssetDevelopRevisionStatus": {
        "description": "Render state of a develop revision",
        "enum": [
          "saved",
          "queued",
          "rendering",
          "rendered",
          "failed",
          "cancelled"
        ],
        "type": "string"
      },
      "AssetDevelopRecipeDto": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "version": {
                "type": "number",
                "enum": [
                  1
                ]
              },
              "exposure": {
                "type": "number",
                "minimum": -2,
                "maximum": 2,
                "format": "double"
              },
              "contrast": {
                "type": "number",
                "minimum": -100,
                "maximum": 100,
                "format": "double"
              },
              "brilliance": {
                "type": "number",
                "minimum": -100,
                "maximum": 100,
                "format": "double"
              },
              "highlights": {
                "type": "number",
                "minimum": -100,
                "maximum": 100,
                "format": "double"
              },
              "shadows": {
                "type": "number",
                "minimum": -100,
                "maximum": 100,
                "format": "double"
              },
              "whites": {
                "type": "number",
                "minimum": -100,
                "maximum": 100,
                "format": "double"
              },
              "blacks": {
                "type": "number",
                "minimum": -100,
                "maximum": 100,
                "format": "double"
              },
              "temperature": {
                "type": "number",
                "minimum": -100,
                "maximum": 100,
                "format": "double"
              },
              "tint": {
                "type": "number",
                "minimum": -100,
                "maximum": 100,
                "format": "double"
              },
              "vibrance": {
                "type": "number",
                "minimum": -100,
                "maximum": 100,
                "format": "double"
              },
              "saturation": {
                "type": "number",
                "minimum": -100,
                "maximum": 100,
                "format": "double"
              },
              "clarity": {
                "type": "number",
                "minimum": -100,
                "maximum": 100,
                "format": "double"
              },
              "dehaze": {
                "type": "number",
                "minimum": -100,
                "maximum": 100,
                "format": "double"
              },
              "vignette": {
                "type": "number",
                "minimum": -100,
                "maximum": 100,
                "format": "double"
              },
              "grain": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "format": "double"
              },
              "sharpen": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "format": "double"
              },
              "noiseReduction": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "format": "double"
              },
              "crop": {
                "$ref": "#/components/schemas/AssetDevelopCrop"
              },
              "straighten": {
                "type": "number",
                "minimum": -45,
                "maximum": 45,
                "format": "double"
              },
              "rotation": {
                "type": "integer",
                "minimum": 0,
                "maximum": 270
              },
              "flipHorizontal": {
                "type": "boolean"
              },
              "flipVertical": {
                "type": "boolean"
              },
              "preset": {
                "$ref": "#/components/schemas/AssetDevelopPreset"
              },
              "presetStrength": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              },
              "masks": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": {}
                }
              },
              "cleanup": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": {}
                }
              }
            },
            "required": [
              "version"
            ],
            "additionalProperties": {}
          },
          {
            "type": "object",
            "properties": {
              "version": {
                "type": "integer",
                "minimum": 2,
                "maximum": 2147483647
              }
            },
            "required": [
              "version"
            ],
            "additionalProperties": {}
          }
        ]
      },
      "AssetDevelopPreset": {
        "description": "Named look applied on top of the develop sliders",
        "enum": [
          "Original",
          "Vivid",
          "Natural",
          "Warm",
          "Cool",
          "Mono",
          "Silvertone",
          "Noir",
          "Fade"
        ],
        "type": "string"
      },
      "AssetDevelopCrop": {
        "additionalProperties": {},
        "properties": {
          "h": {
            "description": "Crop height as a fraction of the frame",
            "format": "double",
            "maximum": 1,
            "minimum": 0.05,
            "type": "number"
          },
          "w": {
            "description": "Crop width as a fraction of the frame",
            "format": "double",
            "maximum": 1,
            "minimum": 0.05,
            "type": "number"
          },
          "x": {
            "description": "Left edge of the crop as a fraction of the oriented frame width",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "y": {
            "description": "Top edge of the crop as a fraction of the oriented frame height",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          }
        },
        "required": [
          "h",
          "w",
          "x",
          "y"
        ],
        "type": "object"
      },
      "AssetDevelopRevisionKind": {
        "description": "How a develop version was produced",
        "enum": [
          "recipe",
          "external"
        ],
        "type": "string"
      },
      "AssetDevelopSaveDto": {
        "properties": {
          "label": {
            "description": "Optional name for the saved version",
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "recipe": {
            "$ref": "#/components/schemas/AssetDevelopRecipeDto"
          },
          "render": {
            "default": true,
            "description": "Queue the edited master render immediately after saving the recipe",
            "type": "boolean"
          },
          "replaceRecipe": {
            "description": "Explicit complete replacement instead of preserving omitted source fields, including intentional removals",
            "type": "boolean"
          },
          "sourceRevisionId": {
            "description": "Immutable revision of this owned asset whose omitted fields are preserved; never the implicit current revision",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "recipe"
        ],
        "type": "object"
      },
      "AssetDevelopArtifactResponseDto": {
        "properties": {
          "height": {
            "description": "Height of the stored bitmap in pixels",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "id": {
            "description": "A develop artifact uploaded for this asset: the lowercase hex SHA-256 of its stored PNG",
            "pattern": "^[0-9a-f]{64}$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/AssetDevelopArtifactKind"
          },
          "width": {
            "description": "Width of the stored bitmap in pixels",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "height",
          "id",
          "kind",
          "width"
        ],
        "type": "object"
      },
      "AssetDevelopArtifactKind": {
        "description": "What a develop artifact is used for",
        "enum": [
          "mask",
          "fill"
        ],
        "type": "string"
      },
      "AssetDevelopArtifactUploadDto": {
        "properties": {
          "file": {
            "description": "A PNG (or another still image the server can read): greyscale for a mask, with alpha for a fill",
            "format": "binary",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/AssetDevelopArtifactKind"
          }
        },
        "required": [
          "file",
          "kind"
        ],
        "type": "object"
      },
      "DevelopExportResponseDto": {
        "properties": {
          "assetId": {
            "description": "Asset whose original was exported",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "createdAt": {
            "description": "When the original was exported",
            "format": "date-time",
            "type": "string"
          },
          "fileName": {
            "description": "File name of the exported original",
            "type": "string"
          },
          "id": {
            "description": "Export ID; quote it when bringing the developed file back",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isCurrentOriginal": {
            "description": "False once the asset original no longer matches the exported bytes; a return is then refused",
            "type": "boolean"
          },
          "sourceChecksum": {
            "description": "SHA-256 (hex) of the original when it was exported",
            "type": "string"
          }
        },
        "required": [
          "assetId",
          "createdAt",
          "fileName",
          "id",
          "isCurrentOriginal",
          "sourceChecksum"
        ],
        "type": "object"
      },
      "AssetDevelopImportDto": {
        "properties": {
          "exportId": {
            "description": "The export this file was developed from",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "file": {
            "description": "The developed file: JPEG, PNG, TIFF, WebP or HEIF",
            "format": "binary",
            "type": "string"
          },
          "label": {
            "description": "Optional name for the new version",
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "renditionChecksum": {
            "description": "SHA-256 (hex) of the file as the client sent it; a transfer that does not match is refused",
            "pattern": "^[\\da-f]{64}$",
            "type": "string"
          },
          "software": {
            "description": "Application the file was developed with",
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "sourceChecksum": {
            "description": "SHA-256 (hex) of the original the file was developed from",
            "pattern": "^[\\da-f]{64}$",
            "type": "string"
          }
        },
        "required": [
          "file"
        ],
        "type": "object"
      },
      "AssetDevelopSemanticMaskDto": {
        "additionalProperties": false,
        "properties": {
          "target": {
            "enum": [
              "subject",
              "sky"
            ],
            "type": "string"
          }
        },
        "required": [
          "target"
        ],
        "type": "object"
      },
      "AssetDevelopPreviewDto": {
        "properties": {
          "recipe": {
            "$ref": "#/components/schemas/AssetDevelopRecipeDto"
          },
          "size": {
            "default": 1280,
            "description": "Longest edge of the preview in pixels; the original is never upscaled",
            "maximum": 2048,
            "minimum": 256,
            "type": "integer"
          }
        },
        "required": [
          "recipe"
        ],
        "type": "object"
      },
      "AssetDevelopRevertDto": {
        "properties": {
          "revisionId": {
            "description": "Rendered revision to make current again; omitted, the original becomes current",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "AssetDevelopFileKind": {
        "description": "Which rendered file of a revision to fetch",
        "enum": [
          "master",
          "preview"
        ],
        "type": "string"
      },
      "VideoEditVersionResponseDto": {
        "properties": {
          "assetId": {
            "description": "Asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "createdAt": {
            "description": "When the version was saved",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "type": "string"
          },
          "edits": {
            "description": "The recipe rendered from the original",
            "items": {
              "$ref": "#/components/schemas/AssetEditActionItemDto"
            },
            "type": "array"
          },
          "id": {
            "description": "Video edit version ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "isCurrent": {
            "description": "Whether this version is the one currently published for playback",
            "type": "boolean"
          },
          "isRequested": {
            "description": "Whether this version is the latest requested save or revert",
            "type": "boolean"
          },
          "purpose": {
            "$ref": "#/components/schemas/VideoEditVersionPurpose"
          },
          "status": {
            "$ref": "#/components/schemas/VideoEditVersionStatus"
          }
        },
        "required": [
          "assetId",
          "createdAt",
          "edits",
          "id",
          "isCurrent",
          "isRequested",
          "purpose",
          "status"
        ],
        "type": "object"
      },
      "VideoEditVersionStatus": {
        "description": "Render status of the version",
        "enum": [
          "pending",
          "ready",
          "failed"
        ],
        "type": "string"
      },
      "VideoEditVersionPurpose": {
        "description": "Why the version was created",
        "enum": [
          "save",
          "export",
          "revert"
        ],
        "type": "string"
      },
      "AssetEditActionItemDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/AssetEditAction"
          },
          "parameters": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CropParameters"
              },
              {
                "$ref": "#/components/schemas/RotateParameters"
              },
              {
                "$ref": "#/components/schemas/MirrorParameters"
              },
              {
                "$ref": "#/components/schemas/TrimParameters"
              },
              {
                "$ref": "#/components/schemas/StraightenParameters"
              },
              {
                "$ref": "#/components/schemas/AdjustParameters"
              },
              {
                "$ref": "#/components/schemas/LookParameters"
              },
              {
                "$ref": "#/components/schemas/ToggleParameters"
              },
              {
                "$ref": "#/components/schemas/StabilizeParameters"
              },
              {
                "$ref": "#/components/schemas/TextOverlayParameters"
              },
              {
                "$ref": "#/components/schemas/AudioParameters"
              },
              {
                "$ref": "#/components/schemas/SpeedParameters"
              }
            ],
            "description": "List of edit actions to apply"
          }
        },
        "required": [
          "action",
          "parameters"
        ],
        "type": "object"
      },
      "SpeedParameters": {
        "properties": {
          "endMs": {
            "description": "Speed segment end time in milliseconds",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "rate": {
            "description": "Playback speed multiplier",
            "format": "double",
            "maximum": 4,
            "minimum": 0.25,
            "type": "number"
          },
          "startMs": {
            "description": "Speed segment start time in milliseconds",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "rate"
        ],
        "type": "object"
      },
      "AudioParameters": {
        "properties": {
          "limit": {
            "description": "Limit a gain above 1 so it cannot clip (the Frameleaf quick editor). Absent or false keeps the earlier unlimited gain",
            "type": "boolean"
          },
          "muted": {
            "type": "boolean"
          },
          "volume": {
            "description": "Audio volume multiplier",
            "format": "double",
            "maximum": 2,
            "minimum": 0,
            "type": "number"
          }
        },
        "type": "object"
      },
      "TextOverlayParameters": {
        "properties": {
          "color": {
            "default": "#ffffff",
            "description": "Text color in hex format",
            "pattern": "^#[0-9a-fA-F]{6}([0-9a-fA-F]{2})?$",
            "type": "string"
          },
          "endMs": {
            "description": "Overlay end time in milliseconds",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "position": {
            "$ref": "#/components/schemas/TextOverlayPosition"
          },
          "shadow": {
            "description": "Draw a soft drop shadow behind the text",
            "type": "boolean"
          },
          "size": {
            "default": 0.06,
            "description": "Font size as a percentage of video height",
            "format": "double",
            "maximum": 0.2,
            "minimum": 0.01,
            "type": "number"
          },
          "startMs": {
            "description": "Overlay start time in milliseconds",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "text": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "x": {
            "description": "Horizontal position as a percentage of video width",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "y": {
            "description": "Vertical position as a percentage of video height",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          }
        },
        "required": [
          "text",
          "x",
          "y"
        ],
        "type": "object"
      },
      "TextOverlayPosition": {
        "description": "Anchor on a 3 × 3 grid; when set, the text is aligned to it and x/y are ignored",
        "enum": [
          "top-left",
          "top",
          "top-right",
          "left",
          "center",
          "right",
          "bottom-left",
          "bottom",
          "bottom-right"
        ],
        "type": "string"
      },
      "StabilizeParameters": {
        "properties": {
          "cropEdges": {
            "description": "Crop the corrected edges 4% and scale back (the Frameleaf quick editor). Absent or false keeps the earlier uncropped render",
            "type": "boolean"
          },
          "enabled": {
            "default": true,
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "ToggleParameters": {
        "properties": {
          "enabled": {
            "default": true,
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "LookParameters": {
        "properties": {
          "intensity": {
            "default": 100,
            "description": "Filter or effect intensity",
            "format": "double",
            "maximum": 100,
            "minimum": 0,
            "type": "number"
          },
          "name": {
            "description": "Filter or effect name",
            "maxLength": 64,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "AdjustParameters": {
        "properties": {
          "blackPoint": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "blacks": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "blueTone": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "brightness": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "clarity": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "contrast": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "dehaze": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "exposure": {
            "description": "Exposure in EV (develop model)",
            "format": "double",
            "maximum": 2,
            "minimum": -2,
            "type": "number"
          },
          "grain": {
            "format": "double",
            "maximum": 100,
            "minimum": 0,
            "type": "number"
          },
          "hdr": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "highlights": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "model": {
            "$ref": "#/components/schemas/VideoAdjustModel"
          },
          "noiseReduction": {
            "format": "double",
            "maximum": 100,
            "minimum": 0,
            "type": "number"
          },
          "preset": {
            "$ref": "#/components/schemas/VideoDevelopPreset"
          },
          "presetStrength": {
            "description": "Strength of the preset, 0 to 100",
            "format": "double",
            "maximum": 100,
            "minimum": 0,
            "type": "number"
          },
          "saturation": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "shadows": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "sharpen": {
            "format": "double",
            "maximum": 100,
            "minimum": 0,
            "type": "number"
          },
          "skinTone": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "temperature": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "tint": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "vibrance": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "vignette": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "warmth": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "whitePoint": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "whites": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          }
        },
        "type": "object"
      },
      "VideoDevelopPreset": {
        "enum": [
          "Original",
          "Vivid",
          "Natural",
          "Warm",
          "Cool",
          "Mono",
          "Silvertone",
          "Noir",
          "Fade",
          "B&W"
        ],
        "type": "string"
      },
      "VideoAdjustModel": {
        "description": "develop: the values follow the photo develop model (exposure, whites, blacks, temperature…), as the Frameleaf quick editor writes them. Absent: the earlier video adjustment model.",
        "enum": [
          "develop"
        ],
        "type": "string"
      },
      "StraightenParameters": {
        "properties": {
          "angle": {
            "description": "Straighten angle in degrees",
            "format": "double",
            "maximum": 45,
            "minimum": -45,
            "type": "number"
          },
          "fill": {
            "description": "Scale the straightened picture to fill its frame (the Frameleaf quick editor). Absent or false keeps the earlier behaviour: black corners, no zoom",
            "type": "boolean"
          }
        },
        "required": [
          "angle"
        ],
        "type": "object"
      },
      "TrimParameters": {
        "properties": {
          "endMs": {
            "description": "Trim end time in milliseconds",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "mode": {
            "$ref": "#/components/schemas/VideoTrimMode"
          },
          "startMs": {
            "description": "Trim start time in milliseconds",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "endMs",
          "startMs"
        ],
        "type": "object"
      },
      "VideoTrimMode": {
        "description": "Precise cuts are frame accurate and re-encode; fast cuts snap to keyframes and copy the streams when nothing else in the recipe needs a re-encode",
        "enum": [
          "precise",
          "fast"
        ],
        "type": "string"
      },
      "MirrorParameters": {
        "properties": {
          "axis": {
            "$ref": "#/components/schemas/MirrorAxis"
          }
        },
        "required": [
          "axis"
        ],
        "type": "object"
      },
      "MirrorAxis": {
        "description": "Axis to mirror along",
        "enum": [
          "horizontal",
          "vertical"
        ],
        "type": "string"
      },
      "RotateParameters": {
        "properties": {
          "angle": {
            "description": "Rotation angle in degrees",
            "maximum": 270,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "angle"
        ],
        "type": "object"
      },
      "CropParameters": {
        "properties": {
          "height": {
            "description": "Height of the crop",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "width": {
            "description": "Width of the crop",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "x": {
            "description": "Top-Left X coordinate of crop",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "y": {
            "description": "Top-Left Y coordinate of crop",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "height",
          "width",
          "x",
          "y"
        ],
        "type": "object"
      },
      "AssetEditAction": {
        "description": "Type of edit action to perform",
        "enum": [
          "crop",
          "rotate",
          "mirror",
          "trim",
          "straighten",
          "adjust",
          "filter",
          "effect",
          "autoEnhance",
          "stabilize",
          "textOverlay",
          "audio",
          "speed"
        ],
        "type": "string"
      },
      "VideoEditExportDto": {
        "properties": {
          "profile": {
            "$ref": "#/components/schemas/VideoEditExportProfile"
          }
        },
        "required": [
          "profile"
        ],
        "type": "object"
      },
      "VideoEditExportProfile": {
        "description": "Export profile. Only the edited master is exported; the playback proxy is never offered for download.",
        "enum": [
          "master"
        ],
        "type": "string"
      },
      "AssetEditsResponseDto": {
        "properties": {
          "assetId": {
            "description": "Asset ID these edits belong to",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "edits": {
            "description": "List of edit actions applied to the asset",
            "items": {
              "$ref": "#/components/schemas/AssetEditActionItemResponseDto"
            },
            "type": "array"
          },
          "originalVideo": {
            "$ref": "#/components/schemas/AssetEditsOriginalVideoDto",
            "description": "Original video display raster and timeline, independent of the current edited version"
          }
        },
        "required": [
          "assetId",
          "edits"
        ],
        "type": "object"
      },
      "AssetEditsOriginalVideoDto": {
        "properties": {
          "colorPolicy": {
            "$ref": "#/components/schemas/AssetEditsColorPolicy",
            "description": "what an edited version does with the original's colour. 'tone-map': an HDR original is rendered to SDR and kept as the reference; 'unsupported': this server cannot render an edited version (Dolby Vision profile 5), so saving is refused and the original stays unchanged"
          },
          "colorReason": {
            "description": "Why, in plain words, for the person editing",
            "type": "string"
          },
          "decodeRefusal": {
            "$ref": "#/components/schemas/DecodeRefusal",
            "description": "set when this server cannot decode the original at all (a Dolby Vision profile outside the qualified matrix, more than 12 bits per component, an undescribable pixel format). colorPolicy is then 'unsupported' and colorReason says why; saving an edited version is refused before any editing"
          },
          "durationMs": {
            "description": "Duration of the original in milliseconds",
            "exclusiveMinimum": true,
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "height": {
            "description": "Displayed height of the original, after its rotation",
            "exclusiveMinimum": true,
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "width": {
            "description": "Displayed width of the original, after its rotation",
            "exclusiveMinimum": true,
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "durationMs",
          "height",
          "width"
        ],
        "type": "object"
      },
      "DecodeRefusal": {
        "description": "why this server cannot decode a video source",
        "enum": [
          "dolbyVisionProfile5",
          "dolbyVisionEnhancementLayer",
          "dolbyVisionProfileUnqualified",
          "dolbyVisionBaseLayerUnknown",
          "unknownPixelFormat",
          "unsupportedBitDepth",
          "unusableGeometry"
        ],
        "type": "string"
      },
      "AssetEditsColorPolicy": {
        "enum": [
          "preserve",
          "tone-map",
          "unsupported"
        ],
        "type": "string"
      },
      "AssetEditActionItemResponseDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/AssetEditAction"
          },
          "id": {
            "description": "Asset edit ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "parameters": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CropParameters"
              },
              {
                "$ref": "#/components/schemas/RotateParameters"
              },
              {
                "$ref": "#/components/schemas/MirrorParameters"
              },
              {
                "$ref": "#/components/schemas/TrimParameters"
              },
              {
                "$ref": "#/components/schemas/StraightenParameters"
              },
              {
                "$ref": "#/components/schemas/AdjustParameters"
              },
              {
                "$ref": "#/components/schemas/LookParameters"
              },
              {
                "$ref": "#/components/schemas/ToggleParameters"
              },
              {
                "$ref": "#/components/schemas/StabilizeParameters"
              },
              {
                "$ref": "#/components/schemas/TextOverlayParameters"
              },
              {
                "$ref": "#/components/schemas/AudioParameters"
              },
              {
                "$ref": "#/components/schemas/SpeedParameters"
              }
            ],
            "description": "List of edit actions to apply"
          }
        },
        "required": [
          "action",
          "id",
          "parameters"
        ],
        "type": "object"
      },
      "AssetEditsCreateDto": {
        "properties": {
          "edits": {
            "description": "List of edit actions to apply",
            "items": {
              "$ref": "#/components/schemas/AssetEditActionItemDto"
            },
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "edits"
        ],
        "type": "object"
      },
      "AssetEditKeyframesResponseDto": {
        "properties": {
          "keyframesMs": {
            "description": "Times of the original's video keyframes in milliseconds from its start, ascending. A fast trim starts at the last one at or before its in point.",
            "items": {
              "maximum": 9007199254740991,
              "minimum": 0,
              "type": "integer"
            },
            "type": "array"
          }
        },
        "required": [
          "keyframesMs"
        ],
        "type": "object"
      },
      "AssetImageEnrichmentResponseDto": {
        "properties": {
          "assetId": {
            "description": "Asset ID",
            "type": "string"
          },
          "description": {
            "$ref": "#/components/schemas/ImageDescriptionEnrichmentResponseDto"
          },
          "nsfwDetection": {
            "$ref": "#/components/schemas/NsfwDetectionEnrichmentResponseDto"
          }
        },
        "required": [
          "assetId",
          "description",
          "nsfwDetection"
        ],
        "type": "object"
      },
      "NsfwDetectionEnrichmentResponseDto": {
        "properties": {
          "appliedTags": {
            "type": "boolean"
          },
          "effectiveIsNsfw": {
            "type": "boolean"
          },
          "error": {
            "type": "string"
          },
          "isNsfw": {
            "type": "boolean"
          },
          "labels": {
            "additionalProperties": {
              "format": "double",
              "type": "number"
            },
            "type": "object"
          },
          "modelName": {
            "type": "string"
          },
          "review": {
            "$ref": "#/components/schemas/ImageEnrichmentReview"
          },
          "score": {
            "format": "double",
            "type": "number"
          },
          "status": {
            "enum": [
              "missing",
              "success",
              "failed"
            ],
            "type": "string"
          },
          "updatedAt": {
            "type": "string"
          }
        },
        "required": [
          "appliedTags",
          "effectiveIsNsfw",
          "status"
        ],
        "type": "object"
      },
      "ImageEnrichmentReview": {
        "properties": {
          "action": {
            "enum": [
              "accepted",
              "marked-safe",
              "marked-nsfw"
            ],
            "type": "string"
          },
          "isNsfw": {
            "type": "boolean"
          },
          "reviewedAt": {
            "description": "Review timestamp",
            "type": "string"
          },
          "reviewedBy": {
            "description": "Reviewer user ID",
            "type": "string"
          }
        },
        "required": [
          "action",
          "isNsfw",
          "reviewedAt",
          "reviewedBy"
        ],
        "type": "object"
      },
      "ImageDescriptionEnrichmentResponseDto": {
        "properties": {
          "appliedDescription": {
            "type": "boolean"
          },
          "appliedTags": {
            "type": "boolean"
          },
          "confidence": {
            "description": "The model's confidence in the description, 0 to 1, when the processing destination reported one; null otherwise",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "nullable": true,
            "type": "number"
          },
          "context": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "destinationId": {
            "description": "The processing destination that generated the description",
            "type": "string"
          },
          "environment": {
            "type": "string"
          },
          "error": {
            "type": "string"
          },
          "modelName": {
            "type": "string"
          },
          "objects": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "people": {
            "items": {
              "properties": {
                "activity": {
                  "type": "string"
                },
                "apparent_age_group": {
                  "type": "string"
                },
                "confidence": {
                  "type": "string"
                },
                "count": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "type": "integer"
                }
              },
              "required": [
                "count",
                "apparent_age_group",
                "activity",
                "confidence"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "skipReason": {
            "description": "Machine-readable reason when status === \"skipped\"",
            "type": "string"
          },
          "staleReason": {
            "$ref": "#/components/schemas/EnrichmentStaleReason",
            "description": "Set when the generated description is out of date: the original was replaced, confirmed names changed, or the saved prompt changed"
          },
          "status": {
            "enum": [
              "missing",
              "success",
              "failed",
              "skipped"
            ],
            "type": "string"
          },
          "tags": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "updatedAt": {
            "type": "string"
          },
          "visibleText": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "appliedDescription",
          "appliedTags",
          "status"
        ],
        "type": "object"
      },
      "EnrichmentStaleReason": {
        "description": "Why a generated result is out of date",
        "enum": [
          "source-changed",
          "identity-changed",
          "config-changed"
        ],
        "type": "string"
      },
      "AssetImageEnrichmentActionRequestDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/AssetImageEnrichmentAction"
          }
        },
        "required": [
          "action"
        ],
        "type": "object"
      },
      "AssetImageEnrichmentAction": {
        "description": "Image enrichment repair action",
        "enum": [
          "rerun-image-description",
          "rerun-nsfw-detection",
          "accept-nsfw-result",
          "mark-nsfw",
          "mark-safe",
          "clear-generated-description",
          "clear-generated-tags"
        ],
        "type": "string"
      },
      "AssetMetadataResponseDto": {
        "properties": {
          "key": {
            "description": "Metadata key",
            "type": "string"
          },
          "updatedAt": {
            "description": "Last update date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "value": {
            "additionalProperties": {},
            "description": "Metadata value (object)",
            "type": "object"
          }
        },
        "required": [
          "key",
          "updatedAt",
          "value"
        ],
        "type": "object"
      },
      "AssetMetadataUpsertDto": {
        "properties": {
          "items": {
            "description": "Metadata items to upsert",
            "items": {
              "$ref": "#/components/schemas/AssetMetadataUpsertItemDto"
            },
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "AssetOcrResponseDto": {
        "properties": {
          "assetId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "boxScore": {
            "description": "Confidence score for text detection box",
            "format": "double",
            "type": "number"
          },
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "text": {
            "description": "Recognized text",
            "type": "string"
          },
          "textScore": {
            "description": "Confidence score for text recognition",
            "format": "double",
            "type": "number"
          },
          "x1": {
            "description": "Normalized x coordinate of box corner 1 (0-1)",
            "format": "double",
            "type": "number"
          },
          "x2": {
            "description": "Normalized x coordinate of box corner 2 (0-1)",
            "format": "double",
            "type": "number"
          },
          "x3": {
            "description": "Normalized x coordinate of box corner 3 (0-1)",
            "format": "double",
            "type": "number"
          },
          "x4": {
            "description": "Normalized x coordinate of box corner 4 (0-1)",
            "format": "double",
            "type": "number"
          },
          "y1": {
            "description": "Normalized y coordinate of box corner 1 (0-1)",
            "format": "double",
            "type": "number"
          },
          "y2": {
            "description": "Normalized y coordinate of box corner 2 (0-1)",
            "format": "double",
            "type": "number"
          },
          "y3": {
            "description": "Normalized y coordinate of box corner 3 (0-1)",
            "format": "double",
            "type": "number"
          },
          "y4": {
            "description": "Normalized y coordinate of box corner 4 (0-1)",
            "format": "double",
            "type": "number"
          }
        },
        "required": [
          "assetId",
          "boxScore",
          "id",
          "text",
          "textScore",
          "x1",
          "x2",
          "x3",
          "x4",
          "y1",
          "y2",
          "y3",
          "y4"
        ],
        "type": "object"
      },
      "AssetRestorationFileKind": {
        "description": "Which file of a restoration to fetch",
        "enum": [
          "before",
          "after",
          "result",
          "result_preview"
        ],
        "type": "string"
      },
      "AssetMediaSize": {
        "description": "Asset media size",
        "enum": [
          "original",
          "fullsize",
          "preview",
          "thumbnail"
        ],
        "type": "string"
      },
      "BestPhotosResponseDto": {
        "properties": {
          "count": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/BestPhotoAssetResponseDto"
            },
            "type": "array"
          },
          "nextPage": {
            "nullable": true,
            "type": "string"
          },
          "total": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "count",
          "items",
          "nextPage",
          "total"
        ],
        "type": "object"
      },
      "BestPhotoAssetResponseDto": {
        "properties": {
          "bestPhotoScore": {
            "$ref": "#/components/schemas/BestPhotoScoreDto"
          },
          "checksum": {
            "description": "Base64-encoded file checksum. SHA-256 (44 chars) for assets uploaded after the SHA-256 transition; SHA-1 (28 chars) for legacy assets. Use the asset `checksumAlgorithm` field to disambiguate when length-based detection is insufficient.",
            "type": "string"
          },
          "createdAt": {
            "description": "The UTC timestamp when the asset was originally uploaded to Frameleaf.",
            "format": "date-time",
            "type": "string"
          },
          "duplicateId": {
            "description": "Duplicate group ID",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "duration": {
            "description": "Video/gif duration in milliseconds (null for static images)",
            "maximum": 2147483647,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "exifInfo": {
            "$ref": "#/components/schemas/ExifResponseDto"
          },
          "fileCreatedAt": {
            "description": "The actual UTC timestamp when the file was created/captured, preserving timezone information. This is the authoritative timestamp for chronological sorting within timeline groups. Combined with timezone data, this can be used to determine the exact moment the photo was taken.",
            "format": "date-time",
            "type": "string"
          },
          "fileModifiedAt": {
            "description": "The UTC timestamp when the file was last modified on the filesystem. This reflects the last time the physical file was changed, which may be different from when the photo was originally taken.",
            "format": "date-time",
            "type": "string"
          },
          "hasMetadata": {
            "description": "Whether asset has metadata",
            "type": "boolean"
          },
          "height": {
            "description": "Asset height",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "id": {
            "description": "Asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isArchived": {
            "description": "Is archived",
            "type": "boolean"
          },
          "isEdited": {
            "description": "Is edited",
            "type": "boolean"
          },
          "isFavorite": {
            "description": "Is favorite",
            "type": "boolean"
          },
          "isOffline": {
            "description": "Is offline",
            "type": "boolean"
          },
          "isTrashed": {
            "description": "Is trashed",
            "type": "boolean"
          },
          "libraryId": {
            "description": "Library ID",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "livePhotoVideoId": {
            "description": "Live photo video ID",
            "nullable": true,
            "type": "string"
          },
          "localDateTime": {
            "description": "The local date and time when the photo/video was taken, derived from EXIF metadata. This represents the photographer's local time regardless of timezone, stored as a timezone-agnostic timestamp. Used for timeline grouping by \"local\" days and months.",
            "format": "date-time",
            "type": "string"
          },
          "origin": {
            "$ref": "#/components/schemas/PartnerOriginDto",
            "description": "present on your own asset when partner sharing copied it from another library (GET /assets/{id})"
          },
          "originalFileName": {
            "description": "Original file name",
            "type": "string"
          },
          "originalMimeType": {
            "description": "Original MIME type",
            "type": "string"
          },
          "originalPath": {
            "description": "Original file path",
            "type": "string"
          },
          "owner": {
            "$ref": "#/components/schemas/UserResponseDto"
          },
          "ownerId": {
            "description": "Owner user ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "people": {
            "items": {
              "$ref": "#/components/schemas/PersonResponseDto"
            },
            "type": "array"
          },
          "resized": {
            "description": "Is resized",
            "type": "boolean"
          },
          "stack": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AssetStackResponseDto"
              }
            ],
            "nullable": true
          },
          "tags": {
            "items": {
              "$ref": "#/components/schemas/TagResponseDto"
            },
            "type": "array"
          },
          "thumbhash": {
            "description": "Thumbhash for thumbnail generation (base64) also used as the c query param for thumbnail cache busting.",
            "nullable": true,
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/AssetTypeEnum"
          },
          "updatedAt": {
            "description": "The UTC timestamp when the asset record was last updated in the database. This is automatically maintained by the database and reflects when any field in the asset was last modified.",
            "format": "date-time",
            "type": "string"
          },
          "visibility": {
            "$ref": "#/components/schemas/AssetVisibility"
          },
          "width": {
            "description": "Asset width",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "bestPhotoScore",
          "checksum",
          "createdAt",
          "duration",
          "fileCreatedAt",
          "fileModifiedAt",
          "hasMetadata",
          "height",
          "id",
          "isArchived",
          "isEdited",
          "isFavorite",
          "isOffline",
          "isTrashed",
          "localDateTime",
          "originalFileName",
          "originalPath",
          "ownerId",
          "thumbhash",
          "type",
          "updatedAt",
          "visibility",
          "width"
        ],
        "type": "object"
      },
      "BestPhotoScoreDto": {
        "properties": {
          "aestheticScore": {
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "nullable": true,
            "type": "number"
          },
          "bestFrameTimestampMs": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "computedAt": {
            "format": "date-time",
            "type": "string"
          },
          "diversityScore": {
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "nullable": true,
            "type": "number"
          },
          "frameMetadata": {
            "additionalProperties": {},
            "nullable": true,
            "type": "object"
          },
          "frameScore": {
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "nullable": true,
            "type": "number"
          },
          "metadata": {
            "additionalProperties": {},
            "nullable": true,
            "type": "object"
          },
          "score": {
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "scoreVersion": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "subjectScore": {
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "nullable": true,
            "type": "number"
          },
          "technicalScore": {
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "nullable": true,
            "type": "number"
          }
        },
        "required": [
          "aestheticScore",
          "bestFrameTimestampMs",
          "computedAt",
          "diversityScore",
          "frameMetadata",
          "frameScore",
          "metadata",
          "score",
          "scoreVersion",
          "subjectScore",
          "technicalScore"
        ],
        "type": "object"
      },
      "ClassificationContributionDto": {
        "properties": {
          "albumId": {
            "type": "string"
          },
          "albumName": {
            "type": "string"
          },
          "archived": {
            "description": "True when this rule archived the item",
            "type": "boolean"
          },
          "decision": {
            "$ref": "#/components/schemas/ClassificationMatchDecision"
          },
          "ruleId": {
            "type": "string"
          },
          "score": {
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "tag": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ClassificationTagDto"
              }
            ],
            "description": "The tag this rule added, when it added one",
            "nullable": true
          }
        },
        "required": [
          "albumId",
          "albumName",
          "archived",
          "decision",
          "ruleId",
          "score",
          "tag"
        ],
        "type": "object"
      },
      "ClassificationTagDto": {
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "type": "object"
      },
      "ClassificationMatchDecision": {
        "description": "What became of an asset a classification rule matched",
        "enum": [
          "matched",
          "suggested",
          "accepted",
          "rejected"
        ],
        "type": "string"
      },
      "ClassificationPreviewResponseDto": {
        "properties": {
          "exact": {
            "description": "True when `matched` counts the whole library, false for a bounded sample",
            "type": "boolean"
          },
          "items": {
            "description": "The first matches, best first",
            "items": {
              "$ref": "#/components/schemas/ClassificationScoredAssetDto"
            },
            "type": "array"
          },
          "matched": {
            "description": "Items that match among those read",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "sampled": {
            "description": "Items read: the whole library when exact, otherwise the newest items",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "visualSearchAvailable": {
            "description": "False when visual phrases cannot be compared right now",
            "type": "boolean"
          }
        },
        "required": [
          "exact",
          "items",
          "matched",
          "sampled",
          "visualSearchAvailable"
        ],
        "type": "object"
      },
      "ClassificationScoredAssetDto": {
        "properties": {
          "assetId": {
            "type": "string"
          },
          "score": {
            "format": "double",
            "nullable": true,
            "type": "number"
          }
        },
        "required": [
          "assetId",
          "score"
        ],
        "type": "object"
      },
      "ClassificationPreviewDto": {
        "properties": {
          "mediaType": {
            "$ref": "#/components/schemas/ClassificationMediaType",
            "default": "any"
          },
          "personIds": {
            "default": [],
            "description": "Match any of these people",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 50,
            "type": "array"
          },
          "sampleSize": {
            "default": 500,
            "description": "How many of the newest items a visual preview reads",
            "maximum": 2000,
            "minimum": 1,
            "type": "integer"
          },
          "tagIds": {
            "default": [],
            "description": "Match any of these tags, or a tag beneath one of them",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 50,
            "type": "array"
          },
          "takenAfter": {
            "default": null,
            "description": "Taken on or after this day (YYYY-MM-DD)",
            "nullable": true,
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string"
          },
          "takenBefore": {
            "default": null,
            "description": "Taken on or before this day (YYYY-MM-DD)",
            "nullable": true,
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string"
          },
          "threshold": {
            "default": 0.25,
            "description": "The confidence a visual phrase has to reach",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "visualQueries": {
            "default": [],
            "description": "Visual category phrases compared with each item",
            "items": {
              "maxLength": 120,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 10,
            "type": "array"
          }
        },
        "type": "object"
      },
      "ClassificationMediaType": {
        "description": "Which media a classification rule considers",
        "enum": [
          "any",
          "photo",
          "video"
        ],
        "type": "string"
      },
      "ClassificationRuleResponseDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/ClassificationRuleAction"
          },
          "albumId": {
            "type": "string"
          },
          "albumName": {
            "type": "string"
          },
          "archive": {
            "type": "boolean"
          },
          "archiveConsentAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "counts": {
            "$ref": "#/components/schemas/ClassificationRuleCountsDto"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "id": {
            "type": "string"
          },
          "lastAppliedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "mediaType": {
            "$ref": "#/components/schemas/ClassificationMediaType"
          },
          "personIds": {
            "description": "Match any of these people",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 50,
            "type": "array"
          },
          "tag": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ClassificationTagDto"
              }
            ],
            "nullable": true
          },
          "tagIds": {
            "description": "Match any of these tags, or a tag beneath one of them",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 50,
            "type": "array"
          },
          "takenAfter": {
            "description": "Taken on or after this day (YYYY-MM-DD)",
            "nullable": true,
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string"
          },
          "takenBefore": {
            "description": "Taken on or before this day (YYYY-MM-DD)",
            "nullable": true,
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string"
          },
          "threshold": {
            "description": "The confidence a visual phrase has to reach",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "visualQueries": {
            "description": "Visual category phrases compared with each item",
            "items": {
              "maxLength": 120,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 10,
            "type": "array"
          }
        },
        "required": [
          "action",
          "albumId",
          "albumName",
          "archive",
          "archiveConsentAt",
          "counts",
          "createdAt",
          "enabled",
          "id",
          "lastAppliedAt",
          "mediaType",
          "personIds",
          "tag",
          "tagIds",
          "takenAfter",
          "takenBefore",
          "threshold",
          "updatedAt",
          "visualQueries"
        ],
        "type": "object"
      },
      "ClassificationRuleCountsDto": {
        "properties": {
          "accepted": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "matched": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "rejected": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "suggested": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "accepted",
          "matched",
          "rejected",
          "suggested"
        ],
        "type": "object"
      },
      "ClassificationRuleAction": {
        "description": "What a classification rule does with a match",
        "enum": [
          "review",
          "tag"
        ],
        "type": "string"
      },
      "ClassificationRuleCreateDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/ClassificationRuleAction",
            "description": "Defaults to the server default rule action"
          },
          "albumName": {
            "description": "Name of the smart album",
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
          },
          "archive": {
            "default": false,
            "description": "Archive matches; requires archiveConsent",
            "type": "boolean"
          },
          "archiveConsent": {
            "description": "The owner explicitly agrees that matches are archived",
            "type": "boolean"
          },
          "description": {
            "description": "Description of the smart album",
            "maxLength": 2000,
            "nullable": true,
            "type": "string"
          },
          "enabled": {
            "default": true,
            "type": "boolean"
          },
          "icon": {
            "description": "Icon of the smart album",
            "maxLength": 80,
            "type": "string"
          },
          "mediaType": {
            "$ref": "#/components/schemas/ClassificationMediaType",
            "default": "any"
          },
          "parentId": {
            "description": "Collection to create the smart album inside",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "personIds": {
            "default": [],
            "description": "Match any of these people",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 50,
            "type": "array"
          },
          "tagIds": {
            "default": [],
            "description": "Match any of these tags, or a tag beneath one of them",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 50,
            "type": "array"
          },
          "tagName": {
            "description": "The rule-owned tag a match receives; null tags nothing",
            "maxLength": 120,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "takenAfter": {
            "default": null,
            "description": "Taken on or after this day (YYYY-MM-DD)",
            "nullable": true,
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string"
          },
          "takenBefore": {
            "default": null,
            "description": "Taken on or before this day (YYYY-MM-DD)",
            "nullable": true,
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string"
          },
          "threshold": {
            "default": 0.25,
            "description": "The confidence a visual phrase has to reach",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "visualQueries": {
            "default": [],
            "description": "Visual category phrases compared with each item",
            "items": {
              "maxLength": 120,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 10,
            "type": "array"
          }
        },
        "required": [
          "albumName"
        ],
        "type": "object"
      },
      "ClassificationRuleUpdateDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/ClassificationRuleAction"
          },
          "archive": {
            "description": "Archive matches; turning it on requires archiveConsent",
            "type": "boolean"
          },
          "archiveConsent": {
            "description": "The owner explicitly agrees that matches are archived",
            "type": "boolean"
          },
          "enabled": {
            "description": "A disabled rule keeps what it applied and stops changing anything",
            "type": "boolean"
          },
          "mediaType": {
            "$ref": "#/components/schemas/ClassificationMediaType"
          },
          "personIds": {
            "description": "Match any of these people",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 50,
            "type": "array"
          },
          "tagIds": {
            "description": "Match any of these tags, or a tag beneath one of them",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 50,
            "type": "array"
          },
          "tagName": {
            "description": "The rule-owned tag a match receives; null tags nothing",
            "maxLength": 120,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "takenAfter": {
            "description": "Taken on or after this day (YYYY-MM-DD)",
            "nullable": true,
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string"
          },
          "takenBefore": {
            "description": "Taken on or before this day (YYYY-MM-DD)",
            "nullable": true,
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string"
          },
          "threshold": {
            "description": "The confidence a visual phrase has to reach",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "visualQueries": {
            "description": "Visual category phrases compared with each item",
            "items": {
              "maxLength": 120,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 10,
            "type": "array"
          }
        },
        "type": "object"
      },
      "ClassificationApplyResponseDto": {
        "properties": {
          "added": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "lastAppliedAt": {
            "format": "date-time",
            "type": "string"
          },
          "removed": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "suggested": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "unchanged": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "added",
          "lastAppliedAt",
          "removed",
          "suggested",
          "unchanged"
        ],
        "type": "object"
      },
      "ClassificationApplyDto": {
        "properties": {
          "assetIds": {
            "description": "Items from the plan; empty records the check when nothing changed",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 500,
            "type": "array"
          }
        },
        "required": [
          "assetIds"
        ],
        "type": "object"
      },
      "ClassificationDecisionResponseDto": {
        "properties": {
          "skipped": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "updated": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "skipped",
          "updated"
        ],
        "type": "object"
      },
      "ClassificationDecisionDto": {
        "properties": {
          "assetIds": {
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 500,
            "minItems": 1,
            "type": "array"
          },
          "decision": {
            "$ref": "#/components/schemas/ClassificationReviewDecision"
          }
        },
        "required": [
          "assetIds",
          "decision"
        ],
        "type": "object"
      },
      "ClassificationReviewDecision": {
        "description": "Keep the matches, or turn them down and undo what the rule applied",
        "enum": [
          "accepted",
          "rejected"
        ],
        "type": "string"
      },
      "ClassificationMatchPageDto": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ClassificationMatchDto"
            },
            "type": "array"
          },
          "nextPage": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "total": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "items",
          "nextPage",
          "total"
        ],
        "type": "object"
      },
      "ClassificationMatchDto": {
        "properties": {
          "archiveContributed": {
            "type": "boolean"
          },
          "assetId": {
            "type": "string"
          },
          "decision": {
            "$ref": "#/components/schemas/ClassificationMatchDecision"
          },
          "score": {
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "tagContributed": {
            "type": "boolean"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "archiveContributed",
          "assetId",
          "decision",
          "score",
          "tagContributed",
          "updatedAt"
        ],
        "type": "object"
      },
      "ClassificationPlanResponseDto": {
        "properties": {
          "added": {
            "description": "Items that would be added or suggested",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "assetIds": {
            "description": "Every item applying would change, for the apply call or a bulk job",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "durable": {
            "description": "True when applying must run as a durable bulk job",
            "type": "boolean"
          },
          "items": {
            "description": "The first items that would be added",
            "items": {
              "$ref": "#/components/schemas/ClassificationScoredAssetDto"
            },
            "type": "array"
          },
          "matched": {
            "description": "Items the rule matches now",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "removed": {
            "description": "Items the rule applied that no longer match",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "truncated": {
            "description": "True when there were more changes than one apply can carry",
            "type": "boolean"
          },
          "visualSearchAvailable": {
            "type": "boolean"
          }
        },
        "required": [
          "added",
          "assetIds",
          "durable",
          "items",
          "matched",
          "removed",
          "truncated",
          "visualSearchAvailable"
        ],
        "type": "object"
      },
      "ClassificationSettingsDto": {
        "properties": {
          "defaultAction": {
            "$ref": "#/components/schemas/ClassificationRuleAction"
          },
          "inlineLimit": {
            "description": "Changes above this many run as a durable bulk job",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "visualCategories": {
            "description": "Whether rules may use visual category phrases",
            "type": "boolean"
          },
          "visualSearchAvailable": {
            "description": "Whether visual phrases can be compared right now",
            "type": "boolean"
          }
        },
        "required": [
          "defaultAction",
          "inlineLimit",
          "visualCategories",
          "visualSearchAvailable"
        ],
        "type": "object"
      },
      "ClusterGroupRequestResponseDto": {
        "properties": {
          "clusterGroupId": {
            "description": "Cluster group the user is invited to join",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "createdAt": {
            "description": "Creation date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "id": {
            "description": "Request ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "userId": {
            "description": "User the request was created for",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "clusterGroupId",
          "createdAt",
          "id",
          "userId"
        ],
        "type": "object"
      },
      "ClusterGroupRequestCreateDto": {
        "properties": {
          "userId": {
            "description": "User to invite into the cluster group",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "userId"
        ],
        "type": "object"
      },
      "DevelopPresetResponseDto": {
        "properties": {
          "createdAt": {
            "description": "When the preset was saved",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "Preset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "description": "Preset name",
            "type": "string"
          },
          "settings": {
            "$ref": "#/components/schemas/DevelopPresetSettingsDto"
          },
          "updatedAt": {
            "description": "When the preset last changed",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "createdAt",
          "id",
          "name",
          "settings",
          "updatedAt"
        ],
        "type": "object"
      },
      "DevelopPresetSettingsDto": {
        "properties": {
          "blacks": {
            "default": 0,
            "description": "Black point",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "brilliance": {
            "default": 0,
            "description": "opens the shadows and holds back the highlights (positive), or the reverse (negative), with a slight colour lift; see the develop recipe protocol",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "clarity": {
            "default": 0,
            "description": "Local contrast in the midtones",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "contrast": {
            "default": 0,
            "description": "Contrast around middle grey",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "dehaze": {
            "default": 0,
            "description": "Haze removal (positive) or addition (negative)",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "exposure": {
            "default": 0,
            "description": "Exposure in EV; each whole stop doubles the light",
            "format": "double",
            "maximum": 2,
            "minimum": -2,
            "type": "number"
          },
          "grain": {
            "default": 0,
            "description": "Film grain amount",
            "format": "double",
            "maximum": 100,
            "minimum": 0,
            "type": "number"
          },
          "highlights": {
            "default": 0,
            "description": "Highlight recovery (negative) or lift (positive)",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "masks": {
            "default": [],
            "description": "Radial and linear selective adjustments, applied in order after the global develop",
            "items": {
              "$ref": "#/components/schemas/DevelopPresetMask"
            },
            "maxItems": 8,
            "type": "array"
          },
          "native": {
            "$ref": "#/components/schemas/DarktableDevelopRecipe"
          },
          "noiseReduction": {
            "default": 0,
            "description": "Luminance noise reduction amount",
            "format": "double",
            "maximum": 100,
            "minimum": 0,
            "type": "number"
          },
          "preset": {
            "$ref": "#/components/schemas/AssetDevelopPreset",
            "default": "Original"
          },
          "presetStrength": {
            "default": 100,
            "description": "How much of the preset is applied, as a percentage",
            "maximum": 100,
            "minimum": 0,
            "type": "integer"
          },
          "saturation": {
            "default": 0,
            "description": "Global saturation",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "shadows": {
            "default": 0,
            "description": "Shadow lift (positive) or deepening (negative)",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "sharpen": {
            "default": 0,
            "description": "Detail sharpening amount",
            "format": "double",
            "maximum": 100,
            "minimum": 0,
            "type": "number"
          },
          "temperature": {
            "default": 0,
            "description": "Warm (positive) or cool (negative) white balance shift",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "tint": {
            "default": 0,
            "description": "Magenta (positive) or green (negative) tint",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "vibrance": {
            "default": 0,
            "description": "Saturation weighted towards muted colours",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "vignette": {
            "default": 0,
            "description": "Darkened (positive) or lightened (negative) edges",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "whites": {
            "default": 0,
            "description": "White point",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          }
        },
        "type": "object"
      },
      "DarktableDevelopRecipe": {
        "additionalProperties": false,
        "properties": {
          "contrast": {
            "format": "double",
            "maximum": 1.99,
            "minimum": 0.01,
            "type": "number"
          },
          "crop": {
            "additionalProperties": false,
            "properties": {
              "h": {
                "description": "Crop height as a fraction of the frame",
                "format": "double",
                "maximum": 1,
                "minimum": 0.05,
                "type": "number"
              },
              "w": {
                "description": "Crop width as a fraction of the frame",
                "format": "double",
                "maximum": 1,
                "minimum": 0.05,
                "type": "number"
              },
              "x": {
                "description": "Left edge of the crop as a fraction of the oriented frame width",
                "format": "double",
                "maximum": 1,
                "minimum": 0,
                "type": "number"
              },
              "y": {
                "description": "Top edge of the crop as a fraction of the oriented frame height",
                "format": "double",
                "maximum": 1,
                "minimum": 0,
                "type": "number"
              }
            },
            "required": [
              "x",
              "y",
              "w",
              "h"
            ],
            "type": "object"
          },
          "curve": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "x": {
                  "description": "Input",
                  "format": "double",
                  "maximum": 1,
                  "minimum": 0,
                  "type": "number"
                },
                "y": {
                  "description": "Output",
                  "format": "double",
                  "maximum": 1,
                  "minimum": 0,
                  "type": "number"
                }
              },
              "required": [
                "x",
                "y"
              ],
              "type": "object"
            },
            "maxItems": 20,
            "minItems": 2,
            "type": "array"
          },
          "exposureEV": {
            "default": 0,
            "format": "double",
            "maximum": 18,
            "minimum": -18,
            "type": "number"
          },
          "flipHorizontal": {
            "type": "boolean"
          },
          "flipVertical": {
            "type": "boolean"
          },
          "highlights": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "lensCorrection": {
            "description": "Use native embedded metadata or Lensfun; refuse absent calibration",
            "type": "boolean"
          },
          "masks": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "adjustments": {
                  "additionalProperties": false,
                  "properties": {
                    "contrast": {
                      "format": "double",
                      "maximum": 1.99,
                      "minimum": 0.01,
                      "type": "number"
                    },
                    "curve": {
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "x": {
                            "description": "Input",
                            "format": "double",
                            "maximum": 1,
                            "minimum": 0,
                            "type": "number"
                          },
                          "y": {
                            "description": "Output",
                            "format": "double",
                            "maximum": 1,
                            "minimum": 0,
                            "type": "number"
                          }
                        },
                        "required": [
                          "x",
                          "y"
                        ],
                        "type": "object"
                      },
                      "maxItems": 20,
                      "minItems": 2,
                      "type": "array"
                    },
                    "exposureEV": {
                      "default": 0,
                      "format": "double",
                      "maximum": 18,
                      "minimum": -18,
                      "type": "number"
                    },
                    "highlights": {
                      "format": "double",
                      "maximum": 100,
                      "minimum": -100,
                      "type": "number"
                    },
                    "saturation": {
                      "format": "double",
                      "maximum": 2,
                      "minimum": 0,
                      "type": "number"
                    },
                    "shadows": {
                      "format": "double",
                      "maximum": 100,
                      "minimum": -100,
                      "type": "number"
                    }
                  },
                  "type": "object"
                },
                "amount": {
                  "default": 100,
                  "description": "How much of the adjustment is applied, as a percentage",
                  "maximum": 100,
                  "minimum": 0,
                  "type": "integer"
                },
                "artifact": {
                  "description": "Subject, sky and background masks: the stored greyscale mask bitmap, covering the whole original image",
                  "nullable": true,
                  "pattern": "^[0-9a-f]{64}$",
                  "type": "string"
                },
                "coordinates": {
                  "enum": [
                    "sensor-active"
                  ],
                  "type": "string"
                },
                "enabled": {
                  "default": true,
                  "description": "A disabled mask is kept but not rendered",
                  "type": "boolean"
                },
                "endX": {
                  "default": 0.5,
                  "description": "Where a linear mask has faded out, across the frame",
                  "format": "double",
                  "maximum": 1,
                  "minimum": 0,
                  "type": "number"
                },
                "endY": {
                  "default": 1,
                  "description": "Where a linear mask has faded out, down the frame",
                  "format": "double",
                  "maximum": 1,
                  "minimum": 0,
                  "type": "number"
                },
                "feather": {
                  "default": 50,
                  "description": "Softness of a radial edge as a percentage of the radius, or of a brush stroke as one of its radius",
                  "maximum": 100,
                  "minimum": 0,
                  "type": "integer"
                },
                "id": {
                  "description": "Client-chosen identifier, unique within the recipe",
                  "maxLength": 40,
                  "minLength": 1,
                  "type": "string"
                },
                "invert": {
                  "default": false,
                  "description": "Apply the adjustment outside the shape instead of inside",
                  "type": "boolean"
                },
                "kind": {
                  "$ref": "#/components/schemas/AssetDevelopMaskKind"
                },
                "name": {
                  "default": null,
                  "description": "Optional name shown in the editor",
                  "maxLength": 60,
                  "minLength": 1,
                  "nullable": true,
                  "type": "string"
                },
                "radiusX": {
                  "default": 0.25,
                  "description": "Horizontal radius of a radial mask as a fraction of the frame width",
                  "format": "double",
                  "maximum": 1,
                  "minimum": 0.01,
                  "type": "number"
                },
                "radiusY": {
                  "default": 0.25,
                  "description": "Vertical radius of a radial mask as a fraction of the frame height",
                  "format": "double",
                  "maximum": 1,
                  "minimum": 0.01,
                  "type": "number"
                },
                "strokes": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "erase": {
                        "default": false,
                        "description": "Erase from the mask instead of painting it (brush masks only)",
                        "type": "boolean"
                      },
                      "points": {
                        "items": {
                          "description": "A point as [x, y] fractions of the original image (before rotation, flips and crop)",
                          "items": {
                            "format": "double",
                            "maximum": 1,
                            "minimum": 0,
                            "type": "number"
                          },
                          "type": "array"
                        },
                        "maxItems": 512,
                        "minItems": 1,
                        "type": "array"
                      },
                      "radius": {
                        "description": "Stroke radius as a fraction of the original image's shorter side",
                        "format": "double",
                        "maximum": 0.5,
                        "minimum": 0.001,
                        "type": "number"
                      }
                    },
                    "required": [
                      "points",
                      "radius"
                    ],
                    "type": "object"
                  },
                  "maxItems": 64,
                  "type": "array"
                },
                "x": {
                  "description": "Centre (radial) or start (linear) across the oriented frame; any value for brush and bitmap masks",
                  "format": "double",
                  "maximum": 1,
                  "minimum": 0,
                  "type": "number"
                },
                "y": {
                  "description": "Centre (radial) or start (linear) down the oriented frame; any value for brush and bitmap masks",
                  "format": "double",
                  "maximum": 1,
                  "minimum": 0,
                  "type": "number"
                }
              },
              "required": [
                "id",
                "kind",
                "x",
                "y",
                "coordinates",
                "adjustments"
              ],
              "type": "object"
            },
            "maxItems": 8,
            "type": "array"
          },
          "noiseThreshold": {
            "description": "Native pre-demosaic wavelet noise threshold",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "renderer": {
            "enum": [
              "darktable/5.6.1"
            ],
            "type": "string"
          },
          "rotation": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32",
                "enum": [
                  0
                ]
              },
              {
                "type": "integer",
                "format": "int32",
                "enum": [
                  90
                ]
              },
              {
                "type": "integer",
                "format": "int32",
                "enum": [
                  180
                ]
              },
              {
                "type": "integer",
                "format": "int32",
                "enum": [
                  270
                ]
              }
            ],
            "description": "Additional clockwise rotation after camera orientation"
          },
          "saturation": {
            "format": "double",
            "maximum": 2,
            "minimum": 0,
            "type": "number"
          },
          "sensorCanvas": {
            "description": "Unrotated, uncropped, uncorrected canvas for selecting sensor-space masks",
            "type": "boolean"
          },
          "shadows": {
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "sharpen": {
            "additionalProperties": false,
            "properties": {
              "amount": {
                "format": "double",
                "maximum": 2,
                "minimum": 0,
                "type": "number"
              },
              "radius": {
                "format": "double",
                "maximum": 99,
                "minimum": 0,
                "type": "number"
              },
              "threshold": {
                "format": "double",
                "maximum": 100,
                "minimum": 0,
                "type": "number"
              }
            },
            "required": [
              "radius",
              "amount",
              "threshold"
            ],
            "type": "object"
          },
          "straighten": {
            "format": "double",
            "maximum": 45,
            "minimum": -45,
            "type": "number"
          },
          "version": {
            "enum": [
              2
            ],
            "format": "int32",
            "type": "integer"
          },
          "whiteBalance": {
            "additionalProperties": false,
            "description": "Multipliers of native camera white-balance coefficients, not Kelvin estimates",
            "properties": {
              "blue": {
                "format": "double",
                "maximum": 8,
                "minimum": 0.1,
                "type": "number"
              },
              "green": {
                "format": "double",
                "maximum": 8,
                "minimum": 0.1,
                "type": "number"
              },
              "red": {
                "format": "double",
                "maximum": 8,
                "minimum": 0.1,
                "type": "number"
              }
            },
            "required": [
              "red",
              "green",
              "blue"
            ],
            "type": "object"
          }
        },
        "required": [
          "renderer",
          "version"
        ],
        "type": "object"
      },
      "AssetDevelopMaskKind": {
        "description": "Shape of a selective adjustment mask",
        "enum": [
          "radial",
          "linear",
          "brush",
          "subject",
          "sky",
          "background"
        ],
        "type": "string"
      },
      "DevelopPresetMask": {
        "properties": {
          "adjustments": {
            "$ref": "#/components/schemas/AssetDevelopMaskAdjustments",
            "default": {
              "blacks": 0,
              "contrast": 0,
              "dehaze": 0,
              "exposure": 0,
              "highlights": 0,
              "saturation": 0,
              "shadows": 0,
              "temperature": 0,
              "tint": 0,
              "vibrance": 0,
              "whites": 0
            }
          },
          "amount": {
            "default": 100,
            "description": "How much of the adjustment is applied, as a percentage",
            "maximum": 100,
            "minimum": 0,
            "type": "integer"
          },
          "enabled": {
            "default": true,
            "description": "A disabled mask is kept but not rendered",
            "type": "boolean"
          },
          "endX": {
            "default": 0.5,
            "description": "Where a linear mask has faded out, across the frame",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "endY": {
            "default": 1,
            "description": "Where a linear mask has faded out, down the frame",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "feather": {
            "default": 50,
            "description": "Softness of a radial edge as a percentage of the radius, or of a brush stroke as one of its radius",
            "maximum": 100,
            "minimum": 0,
            "type": "integer"
          },
          "id": {
            "description": "Client-chosen identifier, unique within the recipe",
            "maxLength": 40,
            "minLength": 1,
            "type": "string"
          },
          "invert": {
            "default": false,
            "description": "Apply the adjustment outside the shape instead of inside",
            "type": "boolean"
          },
          "kind": {
            "$ref": "#/components/schemas/DevelopPresetMaskKind"
          },
          "name": {
            "default": null,
            "description": "Optional name shown in the editor",
            "maxLength": 60,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "radiusX": {
            "default": 0.25,
            "description": "Horizontal radius of a radial mask as a fraction of the frame width",
            "format": "double",
            "maximum": 1,
            "minimum": 0.01,
            "type": "number"
          },
          "radiusY": {
            "default": 0.25,
            "description": "Vertical radius of a radial mask as a fraction of the frame height",
            "format": "double",
            "maximum": 1,
            "minimum": 0.01,
            "type": "number"
          },
          "x": {
            "description": "Centre (radial) or start (linear) across the oriented frame; any value for brush and bitmap masks",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "y": {
            "description": "Centre (radial) or start (linear) down the oriented frame; any value for brush and bitmap masks",
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          }
        },
        "required": [
          "id",
          "kind",
          "x",
          "y"
        ],
        "type": "object"
      },
      "DevelopPresetMaskKind": {
        "description": "Shape of a selective adjustment mask",
        "enum": [
          "radial",
          "linear"
        ],
        "type": "string"
      },
      "AssetDevelopMaskAdjustments": {
        "properties": {
          "blacks": {
            "default": 0,
            "description": "Black point inside the mask",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "contrast": {
            "default": 0,
            "description": "Contrast inside the mask",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "dehaze": {
            "default": 0,
            "description": "Dehaze inside the mask",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "exposure": {
            "default": 0,
            "description": "Exposure in EV inside the mask",
            "format": "double",
            "maximum": 2,
            "minimum": -2,
            "type": "number"
          },
          "highlights": {
            "default": 0,
            "description": "Highlights inside the mask",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "saturation": {
            "default": 0,
            "description": "Saturation inside the mask",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "shadows": {
            "default": 0,
            "description": "Shadows inside the mask",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "temperature": {
            "default": 0,
            "description": "White balance shift inside the mask",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "tint": {
            "default": 0,
            "description": "Tint inside the mask",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "vibrance": {
            "default": 0,
            "description": "Vibrance inside the mask",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "whites": {
            "default": 0,
            "description": "White point inside the mask",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          }
        },
        "type": "object"
      },
      "DevelopPresetCreateDto": {
        "properties": {
          "name": {
            "description": "Name shown in the presets list; unique per account",
            "maxLength": 80,
            "minLength": 1,
            "type": "string"
          },
          "settings": {
            "$ref": "#/components/schemas/DevelopPresetSettingsDto",
            "description": "Settings of the new preset; any left out take their neutral value"
          }
        },
        "required": [
          "name",
          "settings"
        ],
        "type": "object"
      },
      "DevelopPresetUpdateDto": {
        "properties": {
          "name": {
            "description": "Name shown in the presets list; unique per account",
            "maxLength": 80,
            "minLength": 1,
            "type": "string"
          },
          "settings": {
            "$ref": "#/components/schemas/DevelopPresetSettingsUpdateDto",
            "description": "Settings to change; every setting left out, including ones this client does not know, keeps its stored value"
          }
        },
        "type": "object"
      },
      "DevelopPresetSettingsUpdateDto": {
        "properties": {
          "blacks": {
            "description": "Black point",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "brilliance": {
            "description": "opens the shadows and holds back the highlights (positive), or the reverse (negative), with a slight colour lift; see the develop recipe protocol",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "clarity": {
            "description": "Local contrast in the midtones",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "contrast": {
            "description": "Contrast around middle grey",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "dehaze": {
            "description": "Haze removal (positive) or addition (negative)",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "exposure": {
            "description": "Exposure in EV; each whole stop doubles the light",
            "format": "double",
            "maximum": 2,
            "minimum": -2,
            "type": "number"
          },
          "grain": {
            "description": "Film grain amount",
            "format": "double",
            "maximum": 100,
            "minimum": 0,
            "type": "number"
          },
          "highlights": {
            "description": "Highlight recovery (negative) or lift (positive)",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "masks": {
            "description": "Radial and linear selective adjustments, applied in order after the global develop",
            "items": {
              "$ref": "#/components/schemas/DevelopPresetMask"
            },
            "maxItems": 8,
            "type": "array"
          },
          "native": {
            "$ref": "#/components/schemas/DarktableDevelopRecipe"
          },
          "noiseReduction": {
            "description": "Luminance noise reduction amount",
            "format": "double",
            "maximum": 100,
            "minimum": 0,
            "type": "number"
          },
          "preset": {
            "$ref": "#/components/schemas/AssetDevelopPreset"
          },
          "presetStrength": {
            "description": "How much of the preset is applied, as a percentage",
            "maximum": 100,
            "minimum": 0,
            "type": "integer"
          },
          "saturation": {
            "description": "Global saturation",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "shadows": {
            "description": "Shadow lift (positive) or deepening (negative)",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "sharpen": {
            "description": "Detail sharpening amount",
            "format": "double",
            "maximum": 100,
            "minimum": 0,
            "type": "number"
          },
          "temperature": {
            "description": "Warm (positive) or cool (negative) white balance shift",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "tint": {
            "description": "Magenta (positive) or green (negative) tint",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "vibrance": {
            "description": "Saturation weighted towards muted colours",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "vignette": {
            "description": "Darkened (positive) or lightened (negative) edges",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          },
          "whites": {
            "description": "White point",
            "format": "double",
            "maximum": 100,
            "minimum": -100,
            "type": "number"
          }
        },
        "type": "object"
      },
      "DocumentSearchResponseDto": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/AssetResponseDto"
            },
            "type": "array"
          },
          "nextPage": {
            "nullable": true,
            "type": "string"
          },
          "total": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "items",
          "nextPage",
          "total"
        ],
        "type": "object"
      },
      "DocumentResponseDto": {
        "properties": {
          "assetId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "canEdit": {
            "description": "The caller owns the photo and may correct its text",
            "type": "boolean"
          },
          "fields": {
            "items": {
              "$ref": "#/components/schemas/DocumentFieldResponseDto"
            },
            "type": "array"
          },
          "fieldsEnabled": {
            "description": "Field suggestions are switched on",
            "type": "boolean"
          },
          "lines": {
            "items": {
              "$ref": "#/components/schemas/DocumentLineDto"
            },
            "type": "array"
          },
          "recognition": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DocumentRecognitionDto"
              }
            ],
            "description": "Whether the photo can be read again; owner only",
            "nullable": true
          },
          "recognizedAt": {
            "description": "When the text was last read",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "assetId",
          "canEdit",
          "fields",
          "fieldsEnabled",
          "lines",
          "recognition",
          "recognizedAt"
        ],
        "type": "object"
      },
      "DocumentRecognitionDto": {
        "properties": {
          "enabled": {
            "description": "Text recognition is switched on",
            "type": "boolean"
          },
          "routed": {
            "description": "A processing destination is chosen for text recognition",
            "type": "boolean"
          }
        },
        "required": [
          "enabled",
          "routed"
        ],
        "type": "object"
      },
      "DocumentLineDto": {
        "properties": {
          "confidence": {
            "description": "Recognition confidence (0-1)",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "editId": {
            "description": "ID of the owner’s decision about this line",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "evidenceChanged": {
            "description": "The decision was made against text that has since been read differently",
            "type": "boolean"
          },
          "id": {
            "description": "Recognized line ID, or the decision ID of a kept correction",
            "type": "string"
          },
          "ocrId": {
            "description": "Recognized line ID; null once the line is gone",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "recognizedText": {
            "description": "The recognized text, while the recognized line exists",
            "nullable": true,
            "type": "string"
          },
          "region": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DocumentRegionDto"
              }
            ],
            "nullable": true
          },
          "revision": {
            "description": "Revision of the owner’s decision",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/DocumentLineStatus"
          },
          "text": {
            "description": "What the line reads: the owner’s correction or the recognized text",
            "type": "string"
          }
        },
        "required": [
          "confidence",
          "editId",
          "evidenceChanged",
          "id",
          "ocrId",
          "recognizedText",
          "region",
          "revision",
          "status",
          "text"
        ],
        "type": "object"
      },
      "DocumentLineStatus": {
        "description": "Where the text of a document line comes from",
        "enum": [
          "recognized",
          "corrected",
          "dismissed",
          "kept"
        ],
        "type": "string"
      },
      "DocumentRegionDto": {
        "description": "Where the text is in the photo as it is shown, edits applied",
        "properties": {
          "x1": {
            "description": "Normalized x coordinate of corner 1 (0-1)",
            "format": "double",
            "type": "number"
          },
          "x2": {
            "description": "Normalized x coordinate of corner 2 (0-1)",
            "format": "double",
            "type": "number"
          },
          "x3": {
            "description": "Normalized x coordinate of corner 3 (0-1)",
            "format": "double",
            "type": "number"
          },
          "x4": {
            "description": "Normalized x coordinate of corner 4 (0-1)",
            "format": "double",
            "type": "number"
          },
          "y1": {
            "description": "Normalized y coordinate of corner 1 (0-1)",
            "format": "double",
            "type": "number"
          },
          "y2": {
            "description": "Normalized y coordinate of corner 2 (0-1)",
            "format": "double",
            "type": "number"
          },
          "y3": {
            "description": "Normalized y coordinate of corner 3 (0-1)",
            "format": "double",
            "type": "number"
          },
          "y4": {
            "description": "Normalized y coordinate of corner 4 (0-1)",
            "format": "double",
            "type": "number"
          }
        },
        "required": [
          "x1",
          "x2",
          "x3",
          "x4",
          "y1",
          "y2",
          "y3",
          "y4"
        ],
        "type": "object"
      },
      "DocumentFieldResponseDto": {
        "properties": {
          "candidates": {
            "description": "Values the text suggests, most likely first",
            "items": {
              "$ref": "#/components/schemas/DocumentFieldCandidateDto"
            },
            "type": "array"
          },
          "confidence": {
            "description": "Recognition confidence of the supporting line (0-1)",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "editId": {
            "description": "ID of the owner’s decision about this field",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "evidenceChanged": {
            "description": "The supporting text has since been read differently or is gone",
            "type": "boolean"
          },
          "field": {
            "$ref": "#/components/schemas/DocumentField"
          },
          "lineId": {
            "description": "Recognized line supporting the value",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "region": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DocumentRegionDto"
              }
            ],
            "nullable": true
          },
          "revision": {
            "description": "Revision of the owner’s decision",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/DocumentFieldStatus"
          },
          "updatedAt": {
            "description": "When the owner last decided",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "value": {
            "description": "The suggested, confirmed or corrected value; null when dismissed",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "candidates",
          "confidence",
          "editId",
          "evidenceChanged",
          "field",
          "lineId",
          "region",
          "revision",
          "status",
          "updatedAt",
          "value"
        ],
        "type": "object"
      },
      "DocumentFieldStatus": {
        "description": "Whether a document field is a suggestion or the owner decided it",
        "enum": [
          "suggested",
          "confirmed",
          "corrected",
          "dismissed"
        ],
        "type": "string"
      },
      "DocumentField": {
        "description": "A value suggested from recognized text",
        "enum": [
          "date",
          "total",
          "reference",
          "email",
          "phone"
        ],
        "type": "string"
      },
      "DocumentFieldCandidateDto": {
        "properties": {
          "confidence": {
            "description": "Recognition confidence of that line; null for a corrected line",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "lineId": {
            "description": "Recognized line the value was read from",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "region": {
            "$ref": "#/components/schemas/DocumentRegionDto"
          },
          "value": {
            "description": "The value as the text reads it",
            "type": "string"
          }
        },
        "required": [
          "confidence",
          "lineId",
          "region",
          "value"
        ],
        "type": "object"
      },
      "DocumentFieldEditDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/DocumentEditAction"
          },
          "lineId": {
            "description": "Recognized line supporting the value",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "recognizedText": {
            "description": "The recognized text of that line the caller read",
            "type": "string"
          },
          "revision": {
            "description": "Revision of the existing decision, if there is one",
            "maximum": 9007199254740991,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "value": {
            "description": "The value, for confirm and correct",
            "maxLength": 2000,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "action"
        ],
        "type": "object"
      },
      "DocumentEditAction": {
        "description": "What the owner decided about recognized text",
        "enum": [
          "confirm",
          "correct",
          "dismiss"
        ],
        "type": "string"
      },
      "DocumentLineEditDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/DocumentEditAction"
          },
          "ocrId": {
            "description": "Recognized line the decision is about",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "recognizedText": {
            "description": "The recognized text the caller read; refused when it changed",
            "type": "string"
          },
          "revision": {
            "description": "Revision of the existing decision, if there is one",
            "maximum": 9007199254740991,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "value": {
            "description": "The corrected text, for correct",
            "maxLength": 2000,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "action",
          "ocrId",
          "recognizedText"
        ],
        "type": "object"
      },
      "DownloadArchiveDto": {
        "properties": {
          "archiveName": {
            "description": "The name of the archive to download, without extension",
            "type": "string"
          },
          "assetIds": {
            "description": "Asset IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "edited": {
            "description": "Download edited asset if available",
            "type": "boolean"
          }
        },
        "required": [
          "assetIds"
        ],
        "type": "object"
      },
      "DownloadResponseDto": {
        "properties": {
          "archives": {
            "description": "Archive information",
            "items": {
              "$ref": "#/components/schemas/DownloadArchiveInfo"
            },
            "type": "array"
          },
          "totalSize": {
            "description": "Total size in bytes",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "archives",
          "totalSize"
        ],
        "type": "object"
      },
      "DownloadArchiveInfo": {
        "properties": {
          "assetIds": {
            "description": "Asset IDs in this archive",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "size": {
            "description": "Archive size in bytes",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "assetIds",
          "size"
        ],
        "type": "object"
      },
      "DownloadInfoDto": {
        "properties": {
          "albumId": {
            "description": "Album ID to download",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "archiveSize": {
            "description": "Archive size limit in bytes",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "assetIds": {
            "description": "Asset IDs to download",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "userId": {
            "description": "User ID to download assets from",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "DuplicateResponseDto": {
        "properties": {
          "assets": {
            "description": "Duplicate assets",
            "items": {
              "$ref": "#/components/schemas/AssetResponseDto"
            },
            "type": "array"
          },
          "duplicateId": {
            "description": "Duplicate group ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "suggestedKeepAssetIds": {
            "description": "Suggested asset IDs to keep based on file size and EXIF data",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "assets",
          "duplicateId",
          "suggestedKeepAssetIds"
        ],
        "type": "object"
      },
      "DuplicateDecisionHistoryDto": {
        "properties": {
          "active": {
            "description": "Decision and undo jobs still running",
            "items": {
              "$ref": "#/components/schemas/DuplicateActiveOperationDto"
            },
            "type": "array"
          },
          "recent": {
            "description": "The most recent decision jobs, newest first",
            "items": {
              "$ref": "#/components/schemas/DuplicateDecisionBatchDto"
            },
            "type": "array"
          }
        },
        "required": [
          "active",
          "recent"
        ],
        "type": "object"
      },
      "DuplicateDecisionBatchDto": {
        "properties": {
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "groups": {
            "items": {
              "$ref": "#/components/schemas/DuplicateDecisionGroupDto"
            },
            "type": "array"
          },
          "operationId": {
            "description": "The durable job that applied these decisions",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "undoable": {
            "description": "Every decision of the job is applied and none has been undone",
            "type": "boolean"
          }
        },
        "required": [
          "createdAt",
          "groups",
          "operationId",
          "undoable"
        ],
        "type": "object"
      },
      "DuplicateDecisionGroupDto": {
        "properties": {
          "applied": {
            "type": "boolean"
          },
          "decision": {
            "$ref": "#/components/schemas/DuplicateDecisionKind"
          },
          "decisionId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "duplicateId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "keepAssetIds": {
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "memberIds": {
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "trashAssetIds": {
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "undoing": {
            "description": "An undo job has started on this decision",
            "type": "boolean"
          },
          "undone": {
            "type": "boolean"
          }
        },
        "required": [
          "applied",
          "decision",
          "decisionId",
          "duplicateId",
          "keepAssetIds",
          "memberIds",
          "trashAssetIds",
          "undoing",
          "undone"
        ],
        "type": "object"
      },
      "DuplicateDecisionKind": {
        "description": "What the owner decided for a duplicate group",
        "enum": [
          "keepers",
          "keep-all",
          "stack"
        ],
        "type": "string"
      },
      "DuplicateActiveOperationDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/MediaOperationBulkAction"
          },
          "groups": {
            "items": {
              "$ref": "#/components/schemas/DuplicateActiveGroupDto"
            },
            "type": "array"
          },
          "operationId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "action",
          "groups",
          "operationId"
        ],
        "type": "object"
      },
      "DuplicateActiveGroupDto": {
        "properties": {
          "duplicateId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "memberIds": {
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "duplicateId",
          "memberIds"
        ],
        "type": "object"
      },
      "MediaOperationBulkAction": {
        "description": "Bulk action a durable media operation applies",
        "enum": [
          "favorite",
          "unfavorite",
          "archive",
          "unarchive",
          "add-to-album",
          "remove-from-album",
          "tag",
          "untag",
          "change-date",
          "change-description",
          "change-location",
          "mark-sensitive",
          "unmark-sensitive",
          "delete",
          "delete-permanently",
          "restore",
          "stack",
          "unstack",
          "refresh-thumbnails",
          "refresh-metadata",
          "refresh-encoded",
          "refresh-faces",
          "relink-live-photo",
          "resolve-duplicates",
          "undo-duplicates",
          "relink-missing-media",
          "recover-damaged-media",
          "trash-damaged-media",
          "apply-classification-rule"
        ],
        "type": "string"
      },
      "DuplicateResolveDto": {
        "properties": {
          "groups": {
            "description": "List of duplicate groups to resolve",
            "items": {
              "$ref": "#/components/schemas/DuplicateResolveGroupDto"
            },
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "groups"
        ],
        "type": "object"
      },
      "DuplicateResolveGroupDto": {
        "properties": {
          "duplicateId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "keepAssetIds": {
            "description": "Asset IDs to keep",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "trashAssetIds": {
            "description": "Asset IDs to trash or delete",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "duplicateId",
          "keepAssetIds",
          "trashAssetIds"
        ],
        "type": "object"
      },
      "DuplicateReviewGroupDto": {
        "properties": {
          "assets": {
            "description": "The photos of the group this session may see",
            "items": {
              "$ref": "#/components/schemas/AssetResponseDto"
            },
            "type": "array"
          },
          "blockedReason": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DuplicateGroupBlock"
              }
            ],
            "nullable": true
          },
          "duplicateId": {
            "description": "Duplicate group ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "editable": {
            "description": "Whether this session may decide the group",
            "type": "boolean"
          },
          "hiddenMemberCount": {
            "description": "Photos of the group this session does not see",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "kind": {
            "$ref": "#/components/schemas/DuplicateGroupKind"
          },
          "otherOwnerNames": {
            "description": "Display names of the other accounts owning photos of a group blocked by another owner",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "qualities": {
            "items": {
              "$ref": "#/components/schemas/DuplicateReviewQualityDto"
            },
            "type": "array"
          },
          "suggestedKeepAssetIds": {
            "description": "The suggested keeper, from resolution, format and original provenance. Never set for a burst",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "totalBytes": {
            "description": "Size of the originals shown, in bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "assets",
          "blockedReason",
          "duplicateId",
          "editable",
          "hiddenMemberCount",
          "kind",
          "qualities",
          "suggestedKeepAssetIds",
          "totalBytes"
        ],
        "type": "object"
      },
      "DuplicateReviewQualityDto": {
        "properties": {
          "assetId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "reasons": {
            "description": "Evidence for or against keeping this copy",
            "items": {
              "$ref": "#/components/schemas/DuplicateQualityReason"
            },
            "type": "array"
          }
        },
        "required": [
          "assetId",
          "reasons"
        ],
        "type": "object"
      },
      "DuplicateQualityReason": {
        "description": "Evidence behind a duplicate keeper suggestion",
        "enum": [
          "original-format",
          "largest-file",
          "highest-resolution",
          "most-metadata",
          "compressed-copy",
          "lower-resolution"
        ],
        "type": "string"
      },
      "DuplicateGroupKind": {
        "description": "Whether a duplicate group holds copies of one photo or frames of a burst",
        "enum": [
          "duplicates",
          "burst"
        ],
        "type": "string"
      },
      "DuplicateGroupBlock": {
        "description": "Why a duplicate group cannot be decided from this session",
        "enum": [
          "hidden-members",
          "other-owner"
        ],
        "type": "string"
      },
      "VideoMomentSearchResponseDto": {
        "properties": {
          "hits": {
            "items": {
              "$ref": "#/components/schemas/VideoMomentSearchHitDto"
            },
            "type": "array"
          }
        },
        "required": [
          "hits"
        ],
        "type": "object"
      },
      "VideoMomentSearchHitDto": {
        "properties": {
          "assetId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "caption": {
            "nullable": true,
            "type": "string"
          },
          "frameId": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "match": {
            "$ref": "#/components/schemas/VideoMomentMatch"
          },
          "momentId": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "score": {
            "description": "Higher is closer",
            "format": "double",
            "type": "number"
          },
          "timestampMs": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "assetId",
          "caption",
          "frameId",
          "match",
          "momentId",
          "score",
          "timestampMs"
        ],
        "type": "object"
      },
      "VideoMomentMatch": {
        "description": "What a moment search hit matched on",
        "enum": [
          "visual",
          "caption",
          "transcript"
        ],
        "type": "string"
      },
      "VideoMomentSearchDto": {
        "properties": {
          "limit": {
            "default": 24,
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "query": {
            "maxLength": 500,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "VideoMomentsResponseDto": {
        "properties": {
          "assetId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "captionModel": {
            "nullable": true,
            "type": "string"
          },
          "captionedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "coverFrameId": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "coverTimestampMs": {
            "description": "The owner's chosen cover time; null means the best frame",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "embeddingModel": {
            "nullable": true,
            "type": "string"
          },
          "extractorVersion": {
            "nullable": true,
            "type": "string"
          },
          "frames": {
            "items": {
              "$ref": "#/components/schemas/VideoMomentFrameDto"
            },
            "type": "array"
          },
          "framesExtractedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "indexedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "moments": {
            "items": {
              "$ref": "#/components/schemas/VideoMomentDto"
            },
            "type": "array"
          },
          "staleReason": {
            "allOf": [
              {
                "$ref": "#/components/schemas/EnrichmentStaleReason"
              }
            ],
            "nullable": true
          },
          "state": {
            "$ref": "#/components/schemas/VideoMomentIndexState"
          }
        },
        "required": [
          "assetId",
          "captionModel",
          "captionedAt",
          "coverFrameId",
          "coverTimestampMs",
          "embeddingModel",
          "extractorVersion",
          "frames",
          "framesExtractedAt",
          "indexedAt",
          "moments",
          "staleReason",
          "state"
        ],
        "type": "object"
      },
      "VideoMomentIndexState": {
        "description": "Whether the video has current reusable frames",
        "enum": [
          "none",
          "ready",
          "stale"
        ],
        "type": "string"
      },
      "VideoMomentDto": {
        "properties": {
          "caption": {
            "nullable": true,
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "endMs": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "frameId": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "source": {
            "$ref": "#/components/schemas/VideoMomentSource"
          },
          "staleReason": {
            "allOf": [
              {
                "$ref": "#/components/schemas/EnrichmentStaleReason"
              }
            ],
            "nullable": true
          },
          "timestampMs": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "transcript": {
            "description": "Typed by the owner; never generated",
            "nullable": true,
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "caption",
          "createdAt",
          "endMs",
          "frameId",
          "id",
          "source",
          "staleReason",
          "timestampMs",
          "transcript",
          "updatedAt"
        ],
        "type": "object"
      },
      "VideoMomentSource": {
        "description": "Video moment source",
        "enum": [
          "generated",
          "manual"
        ],
        "type": "string"
      },
      "VideoMomentFrameDto": {
        "properties": {
          "frameIndex": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "height": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "indexed": {
            "description": "Has a search embedding from the saved search model",
            "type": "boolean"
          },
          "isCover": {
            "type": "boolean"
          },
          "rank": {
            "description": "1 is the best frame",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "score": {
            "format": "double",
            "type": "number"
          },
          "timestampMs": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "width": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "frameIndex",
          "height",
          "id",
          "indexed",
          "isCover",
          "rank",
          "score",
          "timestampMs",
          "width"
        ],
        "type": "object"
      },
      "VideoMomentCoverDto": {
        "properties": {
          "timestampMs": {
            "description": "Time of the chosen frame; null returns to the best frame",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "timestampMs"
        ],
        "type": "object"
      },
      "VideoMomentCreateDto": {
        "properties": {
          "caption": {
            "maxLength": 500,
            "nullable": true,
            "type": "string"
          },
          "endMs": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "timestampMs": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "transcript": {
            "maxLength": 20000,
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "timestampMs"
        ],
        "type": "object"
      },
      "VideoMomentUpdateDto": {
        "properties": {
          "caption": {
            "maxLength": 500,
            "nullable": true,
            "type": "string"
          },
          "endMs": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "timestampMs": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "transcript": {
            "maxLength": 20000,
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "AssetFaceResponseDto": {
        "description": "Asset face with person",
        "properties": {
          "boundingBoxX1": {
            "description": "Bounding box X1 coordinate",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "boundingBoxX2": {
            "description": "Bounding box X2 coordinate",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "boundingBoxY1": {
            "description": "Bounding box Y1 coordinate",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "boundingBoxY2": {
            "description": "Bounding box Y2 coordinate",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "correctedAt": {
            "description": "When a person last corrected this face (moved, resized, reassigned or unassigned it), or null",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "hiddenAt": {
            "description": "When the owner hid this face, or null. Hidden faces are only listed with withHidden",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "Face ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "imageHeight": {
            "description": "Image height in pixels",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "imageWidth": {
            "description": "Image width in pixels",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "person": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PersonResponseDto"
              }
            ],
            "nullable": true
          },
          "revision": {
            "description": "Changes whenever this face changes; send it back as expectedRevision so a correction made against an older face is refused with 409",
            "type": "string"
          },
          "sourceType": {
            "$ref": "#/components/schemas/SourceType"
          }
        },
        "required": [
          "boundingBoxX1",
          "boundingBoxX2",
          "boundingBoxY1",
          "boundingBoxY2",
          "correctedAt",
          "hiddenAt",
          "id",
          "imageHeight",
          "imageWidth",
          "person",
          "revision"
        ],
        "type": "object"
      },
      "SourceType": {
        "description": "Face detection source type",
        "enum": [
          "machine-learning",
          "exif",
          "manual"
        ],
        "type": "string"
      },
      "AssetFaceCreateDto": {
        "properties": {
          "assetId": {
            "description": "Asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "expectedSourceRevision": {
            "description": "The face source revision (GET /faces/source) the coordinates were drawn on. When the image, its orientation or its edits changed since, the request is refused with 409",
            "type": "string"
          },
          "height": {
            "description": "Face bounding box height",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "imageHeight": {
            "description": "Image height in pixels",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "imageWidth": {
            "description": "Image width in pixels",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "personId": {
            "description": "Person ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "width": {
            "description": "Face bounding box width",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "x": {
            "description": "Face bounding box X coordinate",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "y": {
            "description": "Face bounding box Y coordinate",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "assetId",
          "height",
          "imageHeight",
          "imageWidth",
          "personId",
          "width",
          "x",
          "y"
        ],
        "type": "object"
      },
      "AssetFaceSourceResponseDto": {
        "properties": {
          "assetId": {
            "description": "Asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revision": {
            "description": "Changes when the image, its orientation or its edits change; send it back as expectedSourceRevision",
            "type": "string"
          }
        },
        "required": [
          "assetId",
          "revision"
        ],
        "type": "object"
      },
      "AssetFaceDeleteDto": {
        "properties": {
          "expectedRevision": {
            "description": "The face revision the deletion was decided on; a different current revision is refused with 409",
            "type": "string"
          },
          "force": {
            "description": "Force delete even if person has other faces",
            "type": "boolean"
          }
        },
        "required": [
          "force"
        ],
        "type": "object"
      },
      "AssetFaceCorrectionDto": {
        "properties": {
          "box": {
            "$ref": "#/components/schemas/AssetFaceBoxDto",
            "description": "Move or resize the face, in the displayed (edited) image"
          },
          "expectedPersonId": {
            "description": "The person the face was assigned to when the correction was made (null when unassigned)",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "expectedRevision": {
            "description": "The face revision this correction was made against; a different current revision is refused with 409",
            "type": "string"
          },
          "expectedSourceRevision": {
            "description": "The face source revision (GET /faces/source) the coordinates were drawn on. When the image, its orientation or its edits changed since, the request is refused with 409",
            "type": "string"
          },
          "hidden": {
            "description": "Hide the face, or show a hidden face again",
            "type": "boolean"
          },
          "personId": {
            "description": "Assign the face to this person, or null to unassign it",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "expectedRevision"
        ],
        "type": "object"
      },
      "AssetFaceBoxDto": {
        "properties": {
          "height": {
            "description": "Face bounding box height",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "imageHeight": {
            "description": "Height in pixels of the image the box was drawn on",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "imageWidth": {
            "description": "Width in pixels of the image the box was drawn on",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "width": {
            "description": "Face bounding box width",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "x": {
            "description": "Face bounding box X coordinate",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "y": {
            "description": "Face bounding box Y coordinate",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "height",
          "imageHeight",
          "imageWidth",
          "width",
          "x",
          "y"
        ],
        "type": "object"
      },
      "FaceDto": {
        "properties": {
          "id": {
            "description": "Face ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "ItemShareChangeResponseDto": {
        "properties": {
          "added": {
            "description": "Shares this change added",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "link": {
            "description": "Where recipients open what is shared with them: the Public server URL when set, otherwise the direct-connection address (or a custom hostname pointed at it); null when the server has no address",
            "nullable": true,
            "type": "string"
          },
          "removed": {
            "description": "Shares this change removed",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "shares": {
            "description": "Every share of these items after the change",
            "items": {
              "$ref": "#/components/schemas/ItemShareResponseDto"
            },
            "type": "array"
          }
        },
        "required": [
          "added",
          "link",
          "removed",
          "shares"
        ],
        "type": "object"
      },
      "ItemShareResponseDto": {
        "properties": {
          "assetId": {
            "description": "The shared item",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "createdAt": {
            "description": "When it was shared",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "Share ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sharedWith": {
            "$ref": "#/components/schemas/UserResponseDto",
            "description": "Who the item is shared with"
          }
        },
        "required": [
          "assetId",
          "createdAt",
          "id",
          "sharedWith"
        ],
        "type": "object"
      },
      "ItemShareChangeDto": {
        "properties": {
          "assetIds": {
            "description": "The items (your own) to share or stop sharing",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 1000,
            "minItems": 1,
            "type": "array"
          },
          "userIds": {
            "description": "The people in this library to share them with, or to stop sharing them with",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "assetIds",
          "userIds"
        ],
        "type": "object"
      },
      "ItemShareQueryDto": {
        "properties": {
          "assetIds": {
            "description": "The items (your own) to list the shares of",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 1000,
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "assetIds"
        ],
        "type": "object"
      },
      "ItemShareReceivedResponseDto": {
        "properties": {
          "items": {
            "description": "Items shared with you, newest share first",
            "items": {
              "$ref": "#/components/schemas/ItemShareReceivedDto"
            },
            "type": "array"
          },
          "link": {
            "description": "The address of this list, as sent in share notifications",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "items",
          "link"
        ],
        "type": "object"
      },
      "ItemShareReceivedDto": {
        "properties": {
          "asset": {
            "$ref": "#/components/schemas/AssetResponseDto",
            "description": "The shared item"
          },
          "id": {
            "description": "Share ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "owner": {
            "$ref": "#/components/schemas/UserResponseDto",
            "description": "Who shared it"
          },
          "sharedAt": {
            "description": "When it was shared",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "asset",
          "id",
          "owner",
          "sharedAt"
        ],
        "type": "object"
      },
      "QueuesResponseLegacyDto": {
        "properties": {
          "backgroundTask": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "backupDatabase": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "duplicateDetection": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "editor": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "faceDetection": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "facialRecognition": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "imageDescription": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "imageEnrichment": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "integrityCheck": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "library": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "mediaHealth": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "metadataExtraction": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "migration": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "notifications": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "nsfwDetection": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "ocr": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "petRecognition": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "search": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "sidecar": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "smartSearch": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "storageTemplateMigration": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "thumbnailGeneration": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "videoConversion": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "videoDuplicateDetection": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          },
          "workflow": {
            "$ref": "#/components/schemas/QueueResponseLegacyDto"
          }
        },
        "required": [
          "backgroundTask",
          "backupDatabase",
          "duplicateDetection",
          "editor",
          "faceDetection",
          "facialRecognition",
          "imageDescription",
          "imageEnrichment",
          "integrityCheck",
          "library",
          "mediaHealth",
          "metadataExtraction",
          "migration",
          "notifications",
          "nsfwDetection",
          "ocr",
          "petRecognition",
          "search",
          "sidecar",
          "smartSearch",
          "storageTemplateMigration",
          "thumbnailGeneration",
          "videoConversion",
          "videoDuplicateDetection",
          "workflow"
        ],
        "type": "object"
      },
      "QueueResponseLegacyDto": {
        "properties": {
          "jobCounts": {
            "$ref": "#/components/schemas/QueueStatisticsDto"
          },
          "queueStatus": {
            "$ref": "#/components/schemas/QueueStatusLegacyDto"
          },
          "runId": {
            "description": "Durable run created by a batch start",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          }
        },
        "required": [
          "jobCounts",
          "queueStatus"
        ],
        "type": "object"
      },
      "QueueStatusLegacyDto": {
        "properties": {
          "isActive": {
            "description": "Whether the queue is currently active (has running jobs)",
            "type": "boolean"
          },
          "isPaused": {
            "description": "Whether the queue is paused",
            "type": "boolean"
          }
        },
        "required": [
          "isActive",
          "isPaused"
        ],
        "type": "object"
      },
      "QueueStatisticsDto": {
        "properties": {
          "active": {
            "description": "Number of active jobs",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "completed": {
            "description": "Number of completed jobs",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "delayed": {
            "description": "Number of delayed jobs",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "failed": {
            "description": "Number of failed jobs",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "paused": {
            "description": "Number of paused jobs",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "waiting": {
            "description": "Number of waiting jobs",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "active",
          "completed",
          "delayed",
          "failed",
          "paused",
          "waiting"
        ],
        "type": "object"
      },
      "JobCreateDto": {
        "properties": {
          "name": {
            "$ref": "#/components/schemas/ManualJobName"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "ManualJobName": {
        "description": "Manual job name",
        "enum": [
          "person-cleanup",
          "tag-cleanup",
          "user-cleanup",
          "memory-cleanup",
          "memory-create",
          "backup-database",
          "best-photos-backfill",
          "physical-deduplication-dry-run",
          "physical-deduplication-apply",
          "integrity-missing-files",
          "integrity-untracked-files",
          "integrity-checksum-mismatch",
          "integrity-missing-files-refresh",
          "integrity-untracked-files-refresh",
          "integrity-checksum-mismatch-refresh",
          "integrity-missing-files-delete-all",
          "integrity-untracked-files-delete-all",
          "integrity-checksum-mismatch-delete-all",
          "analytics-collect"
        ],
        "type": "string"
      },
      "JobRunPageDto": {
        "properties": {
          "hasNextPage": {
            "type": "boolean"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/JobRunResponseDto"
            },
            "type": "array"
          }
        },
        "required": [
          "hasNextPage",
          "items"
        ],
        "type": "object"
      },
      "JobRunResponseDto": {
        "properties": {
          "active": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "blocked": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "cancelled": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "completed": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "createdAt": {
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "type": "string"
          },
          "delayed": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "enumerationDone": {
            "type": "boolean"
          },
          "failed": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "finishedAt": {
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "lastProgressAt": {
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "type": "string"
          },
          "lastStage": {
            "nullable": true,
            "type": "string"
          },
          "needsAttention": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "noDispatchBacklog": {
            "type": "boolean"
          },
          "paused": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "reasons": {
            "items": {
              "enum": [
                "worker_unavailable",
                "no_dispatch_backlog",
                "first_setup_pending",
                "dependency_unavailable",
                "dependency_wait",
                "dependency_failed",
                "retry_backoff",
                "scheduled_delay",
                "queue_paused",
                "needs_attention",
                "stage_failed",
                "enumerating",
                "workload-disabled",
                "destination-unavailable",
                "destination-configuration",
                "destination-consent",
                "destination-budget",
                "source-unavailable",
                "local-capacity"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "retrying": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "stageTotals": {
            "properties": {
              "active": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "blocked": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "cancelled": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "completed": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "delayed": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "failed": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "needsAttention": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "paused": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "retrying": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "total": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "waiting": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              }
            },
            "required": [
              "total",
              "completed",
              "failed",
              "needsAttention",
              "cancelled",
              "active",
              "retrying",
              "delayed",
              "paused",
              "waiting",
              "blocked"
            ],
            "type": "object"
          },
          "state": {
            "enum": [
              "running",
              "retrying",
              "delayed",
              "paused",
              "waiting",
              "blocked",
              "unavailable",
              "needs_attention",
              "completed",
              "completed_with_errors",
              "cancelled"
            ],
            "type": "string"
          },
          "total": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "waiting": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "active",
          "blocked",
          "cancelled",
          "completed",
          "createdAt",
          "delayed",
          "enumerationDone",
          "failed",
          "finishedAt",
          "id",
          "kind",
          "lastProgressAt",
          "lastStage",
          "needsAttention",
          "noDispatchBacklog",
          "paused",
          "reasons",
          "retrying",
          "stageTotals",
          "state",
          "total",
          "waiting"
        ],
        "type": "object"
      },
      "JobRunItemPageDto": {
        "properties": {
          "hasNextPage": {
            "type": "boolean"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/JobRunItemResponseDto"
            },
            "type": "array"
          }
        },
        "required": [
          "hasNextPage",
          "items"
        ],
        "type": "object"
      },
      "JobRunItemResponseDto": {
        "properties": {
          "id": {
            "type": "string"
          },
          "lastProgressAt": {
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "type": "string"
          },
          "lastStage": {
            "nullable": true,
            "type": "string"
          },
          "outcome": {
            "enum": [
              "completed",
              "failed",
              "needsAttention",
              "cancelled",
              "active",
              "retrying",
              "delayed",
              "paused",
              "waiting",
              "blocked"
            ],
            "type": "string"
          },
          "reasons": {
            "items": {
              "enum": [
                "worker_unavailable",
                "no_dispatch_backlog",
                "first_setup_pending",
                "dependency_unavailable",
                "dependency_wait",
                "dependency_failed",
                "retry_backoff",
                "scheduled_delay",
                "queue_paused",
                "needs_attention",
                "stage_failed",
                "enumerating",
                "workload-disabled",
                "destination-unavailable",
                "destination-configuration",
                "destination-consent",
                "destination-budget",
                "source-unavailable",
                "local-capacity"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "stageTotals": {
            "properties": {
              "active": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "blocked": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "cancelled": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "completed": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "delayed": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "failed": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "needsAttention": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "paused": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "retrying": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "total": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "waiting": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              }
            },
            "required": [
              "total",
              "completed",
              "failed",
              "needsAttention",
              "cancelled",
              "active",
              "retrying",
              "delayed",
              "paused",
              "waiting",
              "blocked"
            ],
            "type": "object"
          }
        },
        "required": [
          "id",
          "lastProgressAt",
          "lastStage",
          "outcome",
          "reasons",
          "stageTotals"
        ],
        "type": "object"
      },
      "QueueCommandDto": {
        "properties": {
          "command": {
            "$ref": "#/components/schemas/QueueCommand"
          },
          "force": {
            "description": "Force the command execution (if applicable)",
            "type": "boolean"
          }
        },
        "required": [
          "command"
        ],
        "type": "object"
      },
      "QueueCommand": {
        "description": "Queue command to execute",
        "enum": [
          "start",
          "pause",
          "resume",
          "empty",
          "clear-failed"
        ],
        "type": "string"
      },
      "QueueName": {
        "description": "Queue name",
        "enum": [
          "thumbnailGeneration",
          "metadataExtraction",
          "videoConversion",
          "faceDetection",
          "facialRecognition",
          "smartSearch",
          "duplicateDetection",
          "videoDuplicateDetection",
          "backgroundTask",
          "storageTemplateMigration",
          "migration",
          "search",
          "sidecar",
          "library",
          "notifications",
          "backupDatabase",
          "ocr",
          "imageEnrichment",
          "imageDescription",
          "nsfwDetection",
          "mediaHealth",
          "workflow",
          "integrityCheck",
          "editor",
          "petRecognition"
        ],
        "type": "string"
      },
      "LibraryResponseDto": {
        "properties": {
          "assetCount": {
            "description": "Number of assets",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "createdAt": {
            "description": "Creation date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "deletedAt": {
            "description": "When removal was confirmed; set while removal is in progress",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "exclusionPatterns": {
            "description": "Exclusion patterns",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "id": {
            "description": "Library ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "importPaths": {
            "description": "Import paths",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "name": {
            "description": "Library name",
            "type": "string"
          },
          "ownerId": {
            "description": "Owner user ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "refreshedAt": {
            "description": "Last refresh date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "scan": {
            "allOf": [
              {
                "$ref": "#/components/schemas/LibraryScanResponseDto"
              }
            ],
            "description": "The latest scan, or null if the library was never scanned",
            "nullable": true
          },
          "updatedAt": {
            "description": "Last update date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          }
        },
        "required": [
          "assetCount",
          "createdAt",
          "deletedAt",
          "exclusionPatterns",
          "id",
          "importPaths",
          "name",
          "ownerId",
          "refreshedAt",
          "scan",
          "updatedAt"
        ],
        "type": "object"
      },
      "LibraryScanResponseDto": {
        "properties": {
          "added": {
            "description": "New items indexed",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "checked": {
            "description": "Indexed items checked against their folder",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "createdAt": {
            "description": "When the scan was asked for",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "error": {
            "description": "Failure detail for the administrator",
            "nullable": true,
            "type": "string"
          },
          "errorCode": {
            "description": "Stable failure code",
            "nullable": true,
            "type": "string"
          },
          "finishedAt": {
            "description": "When the scan ended",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "offlined": {
            "description": "Items whose file is missing, marked offline",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "onlined": {
            "description": "Offline items whose file is back",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "operationId": {
            "description": "The scan job, a media operation of kind library_scan",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "pauseRequested": {
            "description": "A pause was asked for and the scan has not reached it yet",
            "type": "boolean"
          },
          "phase": {
            "$ref": "#/components/schemas/LibraryScanPhase"
          },
          "processedUnits": {
            "description": "Files and items handled so far",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "progress": {
            "description": "Progress, 0 to 100",
            "format": "double",
            "maximum": 100,
            "minimum": 0,
            "type": "number"
          },
          "retrying": {
            "description": "The scan failed once and waits for its automatic retry",
            "type": "boolean"
          },
          "startedAt": {
            "description": "When the scan first started",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/MediaOperationStatus"
          },
          "stopReason": {
            "allOf": [
              {
                "$ref": "#/components/schemas/LibraryScanStopReason"
              }
            ],
            "nullable": true
          },
          "totalUnits": {
            "description": "Files and items known so far; grows while the folders are read",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "updated": {
            "description": "Items whose file changed and are read again",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "added",
          "checked",
          "createdAt",
          "error",
          "errorCode",
          "finishedAt",
          "offlined",
          "onlined",
          "operationId",
          "pauseRequested",
          "phase",
          "processedUnits",
          "progress",
          "retrying",
          "startedAt",
          "status",
          "stopReason",
          "totalUnits",
          "updated"
        ],
        "type": "object"
      },
      "LibraryScanStopReason": {
        "description": "Why the server stopped a scan on its own",
        "enum": [
          "paths_changed",
          "library_removed",
          "owner_deleted"
        ],
        "type": "string"
      },
      "LibraryScanPhase": {
        "description": "Scan phase",
        "enum": [
          "crawl",
          "check",
          "done"
        ],
        "type": "string"
      },
      "CreateLibraryDto": {
        "properties": {
          "exclusionPatterns": {
            "description": "Exclusion patterns (max 128)",
            "items": {
              "maxLength": 1024,
              "type": "string"
            },
            "maxItems": 128,
            "type": "array"
          },
          "importPaths": {
            "description": "Import paths (max 128)",
            "items": {
              "maxLength": 1024,
              "type": "string"
            },
            "maxItems": 128,
            "type": "array"
          },
          "name": {
            "description": "Library name",
            "maxLength": 160,
            "minLength": 1,
            "type": "string"
          },
          "ownerId": {
            "description": "Owner user ID. Fixed once the library exists.",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "ownerId"
        ],
        "type": "object"
      },
      "ManagedUploadsStatsResponseDto": {
        "properties": {
          "ownerId": {
            "description": "Account whose uploads these are",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "photos": {
            "description": "Number of photos",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "total": {
            "description": "Total number of assets",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "usage": {
            "description": "Storage usage in bytes",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "usagePhysical": {
            "description": "Storage usage in bytes, counting each distinct original file once",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "videos": {
            "description": "Number of videos",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "ownerId",
          "photos",
          "total",
          "usage",
          "usagePhysical",
          "videos"
        ],
        "type": "object"
      },
      "UpdateLibraryDto": {
        "properties": {
          "exclusionPatterns": {
            "description": "Exclusion patterns (max 128)",
            "items": {
              "maxLength": 1024,
              "type": "string"
            },
            "maxItems": 128,
            "type": "array"
          },
          "importPaths": {
            "description": "Import paths (max 128)",
            "items": {
              "maxLength": 1024,
              "type": "string"
            },
            "maxItems": 128,
            "type": "array"
          },
          "name": {
            "description": "Library name",
            "maxLength": 160,
            "minLength": 1,
            "type": "string"
          }
        },
        "type": "object"
      },
      "LibraryRemovalReviewDto": {
        "properties": {
          "albums": {
            "description": "Albums that lose items",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "faces": {
            "description": "Detected faces that will be removed with their items",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "libraryId": {
            "description": "Library ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "description": "Library name, to be typed to confirm",
            "type": "string"
          },
          "offline": {
            "description": "Items already offline",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "originalsKept": {
            "description": "Source files in the import folders are never deleted",
            "type": "boolean"
          },
          "ownerId": {
            "description": "Owner user ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "photos": {
            "description": "Indexed photos that will be removed",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "reviewToken": {
            "description": "Present this to confirm the removal",
            "type": "string"
          },
          "scanActive": {
            "description": "A scan is running and will be stopped",
            "type": "boolean"
          },
          "sharedLinks": {
            "description": "Shared links that lose items",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "total": {
            "description": "Indexed items that will be removed",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "usage": {
            "description": "Original bytes those items reference",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "videos": {
            "description": "Indexed videos that will be removed",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "albums",
          "faces",
          "libraryId",
          "name",
          "offline",
          "originalsKept",
          "ownerId",
          "photos",
          "reviewToken",
          "scanActive",
          "sharedLinks",
          "total",
          "usage",
          "videos"
        ],
        "type": "object"
      },
      "LibraryRemovalDto": {
        "properties": {
          "confirmName": {
            "description": "The library name, typed to confirm",
            "maxLength": 160,
            "minLength": 1,
            "type": "string"
          },
          "reviewToken": {
            "description": "The token from the removal review",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "confirmName",
          "reviewToken"
        ],
        "type": "object"
      },
      "LibraryStatsResponseDto": {
        "properties": {
          "photos": {
            "description": "Number of photos",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "total": {
            "description": "Total number of assets",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "usage": {
            "description": "Storage usage in bytes",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "usagePhysical": {
            "description": "Storage usage in bytes, counting each distinct original file once",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "videos": {
            "description": "Number of videos",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "photos",
          "total",
          "usage",
          "usagePhysical",
          "videos"
        ],
        "type": "object"
      },
      "ValidateLibraryResponseDto": {
        "properties": {
          "importPaths": {
            "description": "Validation results for import paths",
            "items": {
              "$ref": "#/components/schemas/ValidateLibraryImportPathResponseDto"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "ValidateLibraryImportPathResponseDto": {
        "properties": {
          "importPath": {
            "description": "Import path",
            "type": "string"
          },
          "isValid": {
            "description": "Is valid",
            "type": "boolean"
          },
          "message": {
            "description": "Validation message",
            "type": "string"
          },
          "reason": {
            "$ref": "#/components/schemas/LibraryImportPathReason"
          }
        },
        "required": [
          "importPath",
          "isValid",
          "reason"
        ],
        "type": "object"
      },
      "LibraryImportPathReason": {
        "description": "Why an import folder was accepted or refused",
        "enum": [
          "valid",
          "not_absolute",
          "invalid_characters",
          "parent_traversal",
          "upload_folder",
          "contains_upload_folder",
          "not_found",
          "not_directory",
          "not_readable",
          "unavailable",
          "duplicate",
          "nested",
          "other_library"
        ],
        "type": "string"
      },
      "ValidateLibraryDto": {
        "properties": {
          "exclusionPatterns": {
            "description": "Exclusion patterns (max 128)",
            "items": {
              "maxLength": 1024,
              "type": "string"
            },
            "maxItems": 128,
            "type": "array"
          },
          "importPaths": {
            "description": "Import paths to validate (max 128)",
            "items": {
              "maxLength": 1024,
              "type": "string"
            },
            "maxItems": 128,
            "type": "array"
          }
        },
        "type": "object"
      },
      "LivePhotoCandidatesResponseDto": {
        "properties": {
          "candidates": {
            "items": {
              "$ref": "#/components/schemas/LivePhotoCandidateDto"
            },
            "type": "array"
          },
          "suggestionsEnabled": {
            "description": "Library care suggests Live Photo pairs; when false no pairs are looked for",
            "type": "boolean"
          },
          "total": {
            "description": "Total number of candidate pairs found",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "candidates",
          "suggestionsEnabled",
          "total"
        ],
        "type": "object"
      },
      "LivePhotoCandidateDto": {
        "properties": {
          "confidence": {
            "$ref": "#/components/schemas/LivePhotoMatchConfidence"
          },
          "matchReason": {
            "description": "Why these two assets are believed to be a separated live photo pair",
            "type": "string"
          },
          "photo": {
            "$ref": "#/components/schemas/AssetResponseDto"
          },
          "video": {
            "$ref": "#/components/schemas/AssetResponseDto"
          }
        },
        "required": [
          "confidence",
          "matchReason",
          "photo",
          "video"
        ],
        "type": "object"
      },
      "LivePhotoMatchConfidence": {
        "enum": [
          "high",
          "low"
        ],
        "type": "string"
      },
      "LivePhotoRelinkResponseDto": {
        "properties": {
          "results": {
            "items": {
              "$ref": "#/components/schemas/LivePhotoRelinkResultDto"
            },
            "type": "array"
          }
        },
        "required": [
          "results"
        ],
        "type": "object"
      },
      "LivePhotoRelinkResultDto": {
        "properties": {
          "error": {
            "type": "string"
          },
          "photoId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "success": {
            "type": "boolean"
          },
          "videoId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "photoId",
          "success",
          "videoId"
        ],
        "type": "object"
      },
      "LivePhotoRelinkDto": {
        "properties": {
          "pairs": {
            "items": {
              "$ref": "#/components/schemas/LivePhotoRelinkItemDto"
            },
            "maxItems": 1000,
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "pairs"
        ],
        "type": "object"
      },
      "LivePhotoRelinkItemDto": {
        "properties": {
          "photoId": {
            "description": "Still image asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "videoId": {
            "description": "Motion video asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "photoId",
          "videoId"
        ],
        "type": "object"
      },
      "MapReverseGeocodeResponseDto": {
        "properties": {
          "city": {
            "description": "City name",
            "nullable": true,
            "type": "string"
          },
          "country": {
            "description": "Country name",
            "nullable": true,
            "type": "string"
          },
          "state": {
            "description": "State/Province name",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "city",
          "country",
          "state"
        ],
        "type": "object"
      },
      "MapStatisticsResponseDto": {
        "properties": {
          "archived": {
            "description": "The viewer's own located archived items",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "partner": {
            "description": "Always 0: partners' items arrive as the viewer's own copies (kept for older clients)",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "unlocated": {
            "description": "The viewer's own timeline items without a location",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "archived",
          "partner",
          "unlocated"
        ],
        "type": "object"
      },
      "MediaHealthListResponseDto": {
        "properties": {
          "buckets": {
            "items": {
              "$ref": "#/components/schemas/MediaHealthBucketDto"
            },
            "type": "array"
          },
          "run": {
            "allOf": [
              {
                "$ref": "#/components/schemas/MediaHealthRunResponseDto"
              }
            ],
            "nullable": true
          },
          "total": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "buckets",
          "run",
          "total"
        ],
        "type": "object"
      },
      "MediaHealthRunResponseDto": {
        "properties": {
          "category": {
            "$ref": "#/components/schemas/MediaHealthCategory"
          },
          "checkedAssets": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "error": {
            "nullable": true,
            "type": "string"
          },
          "finishedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "foundAssets": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "id": {
            "description": "Media health run ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "startedAt": {
            "format": "date-time",
            "type": "string"
          },
          "status": {
            "description": "Run status",
            "type": "string"
          },
          "totalAssets": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "category",
          "checkedAssets",
          "error",
          "finishedAt",
          "foundAssets",
          "id",
          "startedAt",
          "status",
          "totalAssets"
        ],
        "type": "object"
      },
      "MediaHealthCategory": {
        "description": "Media health category",
        "enum": [
          "missing",
          "corrupt"
        ],
        "type": "string"
      },
      "MediaHealthBucketDto": {
        "properties": {
          "count": {
            "description": "Number of findings in the bucket",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/MediaHealthItemDto"
            },
            "type": "array"
          },
          "timeBucket": {
            "description": "Timeline bucket date",
            "type": "string"
          }
        },
        "required": [
          "count",
          "items",
          "timeBucket"
        ],
        "type": "object"
      },
      "MediaHealthItemDto": {
        "properties": {
          "asset": {
            "$ref": "#/components/schemas/AssetResponseDto"
          },
          "assetId": {
            "description": "Asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "candidates": {
            "items": {
              "$ref": "#/components/schemas/MediaHealthCandidateDto"
            },
            "type": "array"
          },
          "category": {
            "$ref": "#/components/schemas/MediaHealthCategory"
          },
          "checkedAt": {
            "format": "date-time",
            "type": "string"
          },
          "dismissedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "evidence": {
            "additionalProperties": {},
            "type": "object"
          },
          "expectedChecksums": {
            "description": "The checksums recorded for the original, which a copy must match exactly",
            "items": {
              "$ref": "#/components/schemas/MediaHealthChecksumDto"
            },
            "type": "array"
          },
          "id": {
            "description": "Media health finding ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "originalFileName": {
            "description": "Original media filename",
            "type": "string"
          },
          "originalPath": {
            "description": "Original media path",
            "type": "string"
          },
          "provenance": {
            "allOf": [
              {
                "$ref": "#/components/schemas/MediaHealthProvenanceDto"
              }
            ],
            "nullable": true
          },
          "resolution": {
            "additionalProperties": {},
            "type": "object"
          },
          "resolvedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "severity": {
            "$ref": "#/components/schemas/MediaHealthSeverity"
          },
          "status": {
            "$ref": "#/components/schemas/MediaHealthStatus"
          }
        },
        "required": [
          "asset",
          "assetId",
          "candidates",
          "category",
          "checkedAt",
          "dismissedAt",
          "evidence",
          "expectedChecksums",
          "id",
          "originalFileName",
          "originalPath",
          "provenance",
          "resolution",
          "resolvedAt",
          "severity",
          "status"
        ],
        "type": "object"
      },
      "MediaHealthStatus": {
        "description": "Media health status",
        "enum": [
          "found",
          "missing",
          "candidate",
          "relinked",
          "dismissed",
          "resolved",
          "unsupported_raw",
          "corrupt_suspect",
          "corrupt_confirmed",
          "trash_queued",
          "trashed",
          "delete_queued",
          "deleted"
        ],
        "type": "string"
      },
      "MediaHealthSeverity": {
        "description": "Media health severity",
        "enum": [
          "info",
          "warning",
          "critical"
        ],
        "type": "string"
      },
      "MediaHealthProvenanceDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/MediaHealthProvenanceAction"
          },
          "at": {
            "description": "When it was done",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "previousPath": {
            "description": "The path the original had before",
            "nullable": true,
            "type": "string"
          },
          "rootId": {
            "description": "Search location the copy came from",
            "nullable": true,
            "type": "string"
          },
          "rootKind": {
            "allOf": [
              {
                "$ref": "#/components/schemas/MediaHealthRootKind"
              }
            ],
            "nullable": true
          },
          "rootLabel": {
            "description": "Name of the search location",
            "nullable": true,
            "type": "string"
          },
          "sourcePath": {
            "description": "The verified copy that was used",
            "nullable": true,
            "type": "string"
          },
          "userId": {
            "description": "The account that did it",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "action",
          "at",
          "previousPath",
          "rootId",
          "rootKind",
          "rootLabel",
          "sourcePath",
          "userId"
        ],
        "type": "object"
      },
      "MediaHealthRootKind": {
        "description": "Kind of search location",
        "enum": [
          "managed",
          "library",
          "recovery"
        ],
        "type": "string"
      },
      "MediaHealthProvenanceAction": {
        "description": "What was done",
        "enum": [
          "relinked",
          "recovered"
        ],
        "type": "string"
      },
      "MediaHealthChecksumDto": {
        "properties": {
          "algorithm": {
            "$ref": "#/components/schemas/MediaHealthChecksumAlgorithm"
          },
          "value": {
            "description": "Checksum as lowercase hex",
            "type": "string"
          }
        },
        "required": [
          "algorithm",
          "value"
        ],
        "type": "object"
      },
      "MediaHealthChecksumAlgorithm": {
        "description": "Checksum algorithm",
        "enum": [
          "sha1",
          "sha256"
        ],
        "type": "string"
      },
      "MediaHealthCandidateDto": {
        "properties": {
          "candidatePath": {
            "description": "Candidate file path",
            "type": "string"
          },
          "checkedAt": {
            "format": "date-time",
            "type": "string"
          },
          "checksumMatch": {
            "description": "The candidate has exactly the checksum recorded for the original",
            "type": "boolean"
          },
          "checksums": {
            "description": "The checksums the candidate matched, as measured",
            "items": {
              "$ref": "#/components/schemas/MediaHealthChecksumDto"
            },
            "type": "array"
          },
          "chosen": {
            "description": "The reviewer chose this candidate for the finding",
            "type": "boolean"
          },
          "decodeValid": {
            "description": "The candidate decoded successfully; null when not checked",
            "nullable": true,
            "type": "boolean"
          },
          "evidence": {
            "additionalProperties": {},
            "type": "object"
          },
          "healthId": {
            "description": "Media health finding ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "id": {
            "description": "Candidate ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "resolution": {
            "additionalProperties": {},
            "type": "object"
          },
          "rootId": {
            "description": "Search location the candidate was found in",
            "nullable": true,
            "type": "string"
          },
          "rootKind": {
            "allOf": [
              {
                "$ref": "#/components/schemas/MediaHealthRootKind"
              }
            ],
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/MediaHealthStatus"
          },
          "visualMatchScore": {
            "description": "Visual match score from 0 to 1",
            "format": "double",
            "nullable": true,
            "type": "number"
          }
        },
        "required": [
          "candidatePath",
          "checkedAt",
          "checksumMatch",
          "checksums",
          "chosen",
          "decodeValid",
          "evidence",
          "healthId",
          "id",
          "resolution",
          "rootId",
          "rootKind",
          "status",
          "visualMatchScore"
        ],
        "type": "object"
      },
      "MediaHealthBulkResponseDto": {
        "properties": {
          "operationId": {
            "description": "The durable job applying the accepted findings, in Activity; null when none was accepted",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "results": {
            "items": {
              "$ref": "#/components/schemas/MediaHealthBulkResultDto"
            },
            "type": "array"
          }
        },
        "required": [
          "results"
        ],
        "type": "object"
      },
      "MediaHealthBulkResultDto": {
        "properties": {
          "error": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/MediaHealthStatus"
          },
          "success": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "success"
        ],
        "type": "object"
      },
      "MediaHealthChooseCandidatesDto": {
        "properties": {
          "choices": {
            "items": {
              "$ref": "#/components/schemas/MediaHealthCandidateChoiceDto"
            },
            "maxItems": 1000,
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "choices"
        ],
        "type": "object"
      },
      "MediaHealthCandidateChoiceDto": {
        "properties": {
          "candidateId": {
            "description": "Candidate ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "findingId": {
            "description": "Media health finding ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "candidateId",
          "findingId"
        ],
        "type": "object"
      },
      "MediaHealthDeleteCorruptDto": {
        "properties": {
          "confirmText": {
            "description": "Typed confirmation text",
            "type": "string"
          },
          "ids": {
            "description": "Media health finding IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 1000,
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "confirmText",
          "ids"
        ],
        "type": "object"
      },
      "MediaHealthRecoverDto": {
        "properties": {
          "choices": {
            "items": {
              "$ref": "#/components/schemas/MediaHealthCandidateChoiceDto"
            },
            "maxItems": 1000,
            "minItems": 1,
            "type": "array"
          },
          "confirmed": {
            "description": "Must be true: the reviewer checked the checksum and decode evidence and keeps the damaged source",
            "type": "boolean"
          }
        },
        "required": [
          "choices",
          "confirmed"
        ],
        "type": "object"
      },
      "MediaHealthScanResponseDto": {
        "properties": {
          "operationId": {
            "description": "The durable job doing the work, in Activity",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "runId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "runId"
        ],
        "type": "object"
      },
      "MediaHealthBulkActionDto": {
        "properties": {
          "ids": {
            "description": "Media health finding IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 1000,
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "ids"
        ],
        "type": "object"
      },
      "MediaHealthLocateDto": {
        "properties": {
          "ids": {
            "description": "Media health finding IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 1000,
            "minItems": 1,
            "type": "array"
          },
          "rootIds": {
            "description": "Search locations; library storage and external libraries when omitted",
            "items": {
              "maxLength": 200,
              "minLength": 1,
              "type": "string"
            },
            "maxItems": 50,
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "ids"
        ],
        "type": "object"
      },
      "MediaHealthRootsResponseDto": {
        "properties": {
          "roots": {
            "items": {
              "$ref": "#/components/schemas/MediaHealthRootDto"
            },
            "type": "array"
          }
        },
        "required": [
          "roots"
        ],
        "type": "object"
      },
      "MediaHealthRootDto": {
        "properties": {
          "id": {
            "description": "Search location ID",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/MediaHealthRootKind"
          },
          "label": {
            "type": "string"
          },
          "paths": {
            "description": "Folders searched, for review",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "id",
          "kind",
          "label",
          "paths"
        ],
        "type": "object"
      },
      "MediaHealthSummaryResponseDto": {
        "properties": {
          "care": {
            "$ref": "#/components/schemas/MediaHealthCareSettingsDto"
          },
          "operation": {
            "allOf": [
              {
                "$ref": "#/components/schemas/MediaHealthOperationDto"
              }
            ],
            "nullable": true
          },
          "queues": {
            "$ref": "#/components/schemas/MediaHealthQueuesDto"
          },
          "recent": {
            "items": {
              "$ref": "#/components/schemas/MediaHealthActivityDto"
            },
            "type": "array"
          },
          "recoveryAvailable": {
            "description": "At least one recovery location is configured for this reader",
            "type": "boolean"
          },
          "runs": {
            "$ref": "#/components/schemas/MediaHealthRunsDto"
          }
        },
        "required": [
          "care",
          "operation",
          "queues",
          "recent",
          "recoveryAvailable",
          "runs"
        ],
        "type": "object"
      },
      "MediaHealthRunsDto": {
        "properties": {
          "corrupt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/MediaHealthRunResponseDto"
              }
            ],
            "nullable": true
          },
          "missing": {
            "allOf": [
              {
                "$ref": "#/components/schemas/MediaHealthRunResponseDto"
              }
            ],
            "nullable": true
          }
        },
        "required": [
          "corrupt",
          "missing"
        ],
        "type": "object"
      },
      "MediaHealthActivityDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/MediaHealthActivityAction"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "finishedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "Media operation ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "items": {
            "description": "Items the job covered",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/MediaOperationStatus"
          }
        },
        "required": [
          "action",
          "createdAt",
          "finishedAt",
          "id",
          "items",
          "status"
        ],
        "type": "object"
      },
      "MediaHealthActivityAction": {
        "description": "What the job did",
        "enum": [
          "scan",
          "locate",
          "relink-missing-media",
          "recover-damaged-media",
          "trash-damaged-media"
        ],
        "type": "string"
      },
      "MediaHealthQueuesDto": {
        "properties": {
          "damagedConfirmed": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "damagedSuspected": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "duplicates": {
            "description": "Duplicate groups waiting for review",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "enrichmentPending": {
            "description": "Items whose metadata has not been read yet",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "importReview": {
            "description": "Imported items that need review; null when unavailable",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "missing": {
            "description": "Missing originals that still need a decision",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "missingVerified": {
            "description": "Missing originals with a verified exact copy",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "unsupportedRaw": {
            "description": "Kept apart from damage: the decoder cannot read the format",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "damagedConfirmed",
          "damagedSuspected",
          "duplicates",
          "enrichmentPending",
          "importReview",
          "missing",
          "missingVerified",
          "unsupportedRaw"
        ],
        "type": "object"
      },
      "MediaHealthOperationDto": {
        "properties": {
          "autoRetries": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "cancelRequestedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "error": {
            "nullable": true,
            "type": "string"
          },
          "finishedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "Media operation ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "mode": {
            "$ref": "#/components/schemas/MediaHealthOperationMode"
          },
          "pauseRequestedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "processedUnits": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "progress": {
            "format": "double",
            "type": "number"
          },
          "status": {
            "$ref": "#/components/schemas/MediaOperationStatus"
          },
          "totalUnits": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "autoRetries",
          "cancelRequestedAt",
          "createdAt",
          "error",
          "finishedAt",
          "id",
          "mode",
          "pauseRequestedAt",
          "processedUnits",
          "progress",
          "status",
          "totalUnits",
          "updatedAt"
        ],
        "type": "object"
      },
      "MediaHealthOperationMode": {
        "description": "A library scan or a search for originals",
        "enum": [
          "scan",
          "locate"
        ],
        "type": "string"
      },
      "MediaHealthCareSettingsDto": {
        "properties": {
          "checksumScan": {
            "description": "Health scans verify original checksums",
            "type": "boolean"
          },
          "duplicateReview": {
            "description": "Near-duplicates are grouped for review",
            "type": "boolean"
          },
          "healthScan": {
            "description": "Incremental health scans run on a schedule",
            "type": "boolean"
          },
          "integrityAudit": {
            "description": "Database and file reference audits run on their schedules",
            "type": "boolean"
          },
          "rawRecovery": {
            "description": "Searches for originals include RAW originals",
            "type": "boolean"
          }
        },
        "required": [
          "checksumScan",
          "duplicateReview",
          "healthScan",
          "integrityAudit",
          "rawRecovery"
        ],
        "type": "object"
      },
      "StudioReverseConformResultDto": {
        "properties": {
          "browserPreview": {
            "properties": {
              "checksum": {
                "pattern": "^[a-f0-9]{64}$",
                "type": "string"
              },
              "contentType": {
                "enum": [
                  "video/mp4"
                ],
                "type": "string"
              },
              "delivery": {
                "enum": [
                  "authenticated"
                ],
                "type": "string"
              },
              "generatedId": {
                "pattern": "^[\\w.:-]{1,128}$",
                "type": "string"
              },
              "profile": {
                "enum": [
                  "h264-main-3.2-aac-lc-v1"
                ],
                "type": "string"
              }
            },
            "required": [
              "generatedId",
              "checksum",
              "contentType",
              "profile",
              "delivery"
            ],
            "type": "object"
          },
          "clipId": {
            "nullable": true,
            "pattern": "^[\\w.:-]{1,128}$",
            "type": "string"
          },
          "frameRate": {
            "properties": {
              "den": {
                "maximum": 9007199254740991,
                "minimum": 1,
                "type": "integer"
              },
              "num": {
                "maximum": 9007199254740991,
                "minimum": 1,
                "type": "integer"
              }
            },
            "required": [
              "num",
              "den"
            ],
            "type": "object"
          },
          "frames": {
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "generatedId": {
            "pattern": "^[\\w.:-]{1,128}$",
            "type": "string"
          },
          "height": {
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "operationId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "projectId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "sourceRevision": {
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "width": {
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "browserPreview",
          "clipId",
          "frameRate",
          "frames",
          "generatedId",
          "height",
          "operationId",
          "projectId",
          "sourceRevision",
          "width"
        ],
        "type": "object"
      },
      "MemoryResponseDto": {
        "properties": {
          "assets": {
            "items": {
              "$ref": "#/components/schemas/AssetResponseDto"
            },
            "type": "array"
          },
          "createdAt": {
            "description": "Creation date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "data": {
            "$ref": "#/components/schemas/MemoryData"
          },
          "deletedAt": {
            "description": "Deletion date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "hideAt": {
            "description": "Date when memory should be hidden",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "id": {
            "description": "Memory ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isHidden": {
            "description": "Hidden by the owner; shown only in the hidden memories list",
            "type": "boolean"
          },
          "isSaved": {
            "description": "Is memory saved",
            "type": "boolean"
          },
          "memoryAt": {
            "description": "Memory date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "ownerId": {
            "description": "Owner user ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "seenAt": {
            "description": "Date when memory was seen",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "showAt": {
            "description": "Date when memory should be shown",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "title": {
            "description": "The owner's own title, when they set one",
            "nullable": true,
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/MemoryType"
          },
          "updatedAt": {
            "description": "Last update date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          }
        },
        "required": [
          "assets",
          "createdAt",
          "data",
          "id",
          "isHidden",
          "isSaved",
          "memoryAt",
          "ownerId",
          "title",
          "type",
          "updatedAt"
        ],
        "type": "object"
      },
      "MemoryType": {
        "description": "Memory type",
        "enum": [
          "on_this_day",
          "event_story",
          "year_in_review",
          "pet_story",
          "birthday",
          "person_recap"
        ],
        "type": "string"
      },
      "MemoryData": {
        "anyOf": [
          {
            "$ref": "#/components/schemas/EventStoryDto"
          },
          {
            "$ref": "#/components/schemas/YearInReviewDto"
          },
          {
            "$ref": "#/components/schemas/PetStoryDto"
          },
          {
            "$ref": "#/components/schemas/BirthdayMemoryDto"
          },
          {
            "$ref": "#/components/schemas/PersonRecapDto"
          },
          {
            "$ref": "#/components/schemas/OnThisDayDto"
          }
        ],
        "description": "Memory data"
      },
      "OnThisDayDto": {
        "properties": {
          "year": {
            "description": "Year for on this day memory",
            "maximum": 9999,
            "minimum": 1000,
            "type": "integer"
          }
        },
        "required": [
          "year"
        ],
        "type": "object"
      },
      "PersonRecapDto": {
        "properties": {
          "assetCount": {
            "description": "Number of their photos and videos that year",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "kind": {
            "description": "Discriminator for a person or pet recap",
            "enum": [
              "person_recap"
            ],
            "type": "string"
          },
          "name": {
            "description": "Their name when the memory was made",
            "type": "string"
          },
          "subject": {
            "description": "Whether the recap is about a person or a pet",
            "enum": [
              "person",
              "pet"
            ],
            "type": "string"
          },
          "subjectId": {
            "description": "The owner's person or pet",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "year": {
            "description": "Calendar year being recapped",
            "maximum": 9999,
            "minimum": 1000,
            "type": "integer"
          }
        },
        "required": [
          "assetCount",
          "kind",
          "name",
          "subject",
          "subjectId",
          "year"
        ],
        "type": "object"
      },
      "BirthdayMemoryDto": {
        "properties": {
          "age": {
            "description": "Age reached on this birthday",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "date": {
            "description": "The birthday this year, 'yyyy-MM-dd'",
            "type": "string"
          },
          "kind": {
            "description": "Discriminator for a birthday",
            "enum": [
              "birthday"
            ],
            "type": "string"
          },
          "name": {
            "description": "Their name when the memory was made",
            "type": "string"
          },
          "subject": {
            "description": "Whether the birthday is a person's or a pet's",
            "enum": [
              "person",
              "pet"
            ],
            "type": "string"
          },
          "subjectId": {
            "description": "The owner's person or pet whose birthday it is",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "year": {
            "description": "Year of this birthday",
            "maximum": 9999,
            "minimum": 1000,
            "type": "integer"
          }
        },
        "required": [
          "age",
          "date",
          "kind",
          "name",
          "subject",
          "subjectId",
          "year"
        ],
        "type": "object"
      },
      "PetStoryDto": {
        "properties": {
          "assetCount": {
            "description": "Confirmed photos of the pet that month, before the diversity pass",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "kind": {
            "description": "Discriminator for a pet story",
            "enum": [
              "pet_story"
            ],
            "type": "string"
          },
          "month": {
            "description": "The owner's local month, 'yyyy-MM'",
            "type": "string"
          },
          "name": {
            "description": "The pet name",
            "type": "string"
          },
          "petId": {
            "description": "The pet the story is about",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "species": {
            "description": "The pet species",
            "type": "string"
          },
          "year": {
            "description": "Year of the month",
            "maximum": 9999,
            "minimum": 1000,
            "type": "integer"
          }
        },
        "required": [
          "assetCount",
          "kind",
          "month",
          "name",
          "petId",
          "species",
          "year"
        ],
        "type": "object"
      },
      "YearInReviewDto": {
        "properties": {
          "assetCount": {
            "description": "Number of assets captured that year",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "kind": {
            "description": "Discriminator for a year in review recap",
            "enum": [
              "year_in_review"
            ],
            "type": "string"
          },
          "monthCount": {
            "description": "Number of distinct months represented",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "year": {
            "description": "Calendar year being recapped",
            "maximum": 9999,
            "minimum": 1000,
            "type": "integer"
          }
        },
        "required": [
          "assetCount",
          "kind",
          "monthCount",
          "year"
        ],
        "type": "object"
      },
      "EventStoryDto": {
        "properties": {
          "assetCount": {
            "description": "Number of assets the event held before the diversity pass",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "dayCount": {
            "description": "Number of distinct local days the event covers",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "endDate": {
            "description": "Last local day of the event, 'yyyy-MM-dd'",
            "type": "string"
          },
          "kind": {
            "description": "Discriminator for an event story",
            "enum": [
              "event_story"
            ],
            "type": "string"
          },
          "place": {
            "$ref": "#/components/schemas/MemoryStoryPlaceDto"
          },
          "startDate": {
            "description": "First local day of the event, 'yyyy-MM-dd'",
            "type": "string"
          },
          "title": {
            "description": "Place label for the event, when it has one",
            "type": "string"
          },
          "year": {
            "description": "Year the event started",
            "maximum": 9999,
            "minimum": 1000,
            "type": "integer"
          }
        },
        "required": [
          "assetCount",
          "dayCount",
          "endDate",
          "kind",
          "startDate",
          "year"
        ],
        "type": "object"
      },
      "MemoryStoryPlaceDto": {
        "properties": {
          "city": {
            "description": "City",
            "nullable": true,
            "type": "string"
          },
          "country": {
            "description": "Country",
            "nullable": true,
            "type": "string"
          },
          "state": {
            "description": "State or region",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "city",
          "country",
          "state"
        ],
        "type": "object"
      },
      "MemorySearchOrder": {
        "description": "Sort order",
        "enum": [
          "asc",
          "desc",
          "random"
        ],
        "type": "string"
      },
      "MemoryCreateDto": {
        "properties": {
          "assetIds": {
            "description": "Asset IDs to associate with memory",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "data": {
            "$ref": "#/components/schemas/MemoryData"
          },
          "hideAt": {
            "description": "Date when memory should be hidden",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "isSaved": {
            "description": "Is memory saved",
            "type": "boolean"
          },
          "memoryAt": {
            "description": "Memory date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "seenAt": {
            "description": "Date when memory was seen",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "showAt": {
            "description": "Date when memory should be shown",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/MemoryType"
          }
        },
        "required": [
          "data",
          "memoryAt",
          "type"
        ],
        "type": "object"
      },
      "MemoryExportResponseDto": {
        "properties": {
          "assetCount": {
            "description": "Number of assets in the export",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "createdAt": {
            "description": "When the export was requested",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "error": {
            "description": "Failure reason, when the export failed",
            "nullable": true,
            "type": "string"
          },
          "expiresAt": {
            "description": "When the archive is deleted",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "finishedAt": {
            "description": "When the export reached a terminal state",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "format": {
            "$ref": "#/components/schemas/MemoryExportFormat"
          },
          "highlight": {
            "allOf": [
              {
                "$ref": "#/components/schemas/MemoryHighlightResponseDto"
              }
            ],
            "description": "The highlight video settings and render state, for a `highlight` export",
            "nullable": true
          },
          "id": {
            "description": "Export ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isDownloadable": {
            "description": "Whether the archive can be downloaded right now",
            "type": "boolean"
          },
          "memoryId": {
            "description": "Memory the export was requested for",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "ownerId": {
            "description": "Owner user ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "processedAssets": {
            "description": "Number of assets written so far",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "sizeInBytes": {
            "description": "Size of the finished archive",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "startedAt": {
            "description": "When the worker picked the export up",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/MemoryExportStatus"
          },
          "title": {
            "description": "The memory's title when the export was requested",
            "type": "string"
          },
          "updatedAt": {
            "description": "Last update date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          }
        },
        "required": [
          "assetCount",
          "createdAt",
          "error",
          "expiresAt",
          "finishedAt",
          "format",
          "highlight",
          "id",
          "isDownloadable",
          "memoryId",
          "ownerId",
          "processedAssets",
          "sizeInBytes",
          "startedAt",
          "status",
          "title",
          "updatedAt"
        ],
        "type": "object"
      },
      "MemoryExportStatus": {
        "description": "Memory export status",
        "enum": [
          "pending",
          "running",
          "ready",
          "failed",
          "cancelling",
          "cancelled"
        ],
        "type": "string"
      },
      "MemoryHighlightResponseDto": {
        "properties": {
          "audio": {
            "$ref": "#/components/schemas/MemoryHighlightAudio"
          },
          "destination": {
            "$ref": "#/components/schemas/MemoryHighlightDestination"
          },
          "lengthSeconds": {
            "description": "Target length in seconds",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "progress": {
            "description": "Render progress, 0 to 100",
            "maximum": 100,
            "minimum": 0,
            "type": "integer"
          },
          "resolution": {
            "$ref": "#/components/schemas/StudioExportResolution"
          },
          "savedAssetId": {
            "description": "The library asset the highlight was saved as, once saved",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "audio",
          "destination",
          "lengthSeconds",
          "progress",
          "resolution",
          "savedAssetId"
        ],
        "type": "object"
      },
      "StudioExportResolution": {
        "description": "Output resolution",
        "enum": [
          "720p",
          "1080p",
          "1440p",
          "2160p"
        ],
        "type": "string"
      },
      "MemoryHighlightDestination": {
        "description": "Where the highlight renders: this server or another computer on your home network",
        "enum": [
          "local",
          "lan"
        ],
        "type": "string"
      },
      "MemoryHighlightAudio": {
        "description": "Sound of a memory highlight video",
        "enum": [
          "original",
          "silent"
        ],
        "type": "string"
      },
      "MemoryExportFormat": {
        "description": "Memory export format",
        "enum": [
          "archive",
          "highlight"
        ],
        "type": "string"
      },
      "MemoryShowLessResponseDto": {
        "properties": {
          "createdAt": {
            "description": "When the rule was added",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/MemoryShowLessKind"
          },
          "name": {
            "description": "The person's or pet's name, for person and pet rules",
            "nullable": true,
            "type": "string"
          },
          "value": {
            "description": "A person or pet id, a date as 'MM-dd', or a memory type",
            "type": "string"
          }
        },
        "required": [
          "createdAt",
          "kind",
          "name",
          "value"
        ],
        "type": "object"
      },
      "MemoryShowLessKind": {
        "description": "What a memories show-less rule names",
        "enum": [
          "person",
          "pet",
          "date",
          "type"
        ],
        "type": "string"
      },
      "MemoryShowLessDto": {
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/MemoryShowLessKind"
          },
          "value": {
            "description": "A person or pet id, a date as 'MM-dd', or a memory type",
            "maxLength": 64,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "kind",
          "value"
        ],
        "type": "object"
      },
      "MemoryStatisticsResponseDto": {
        "properties": {
          "total": {
            "description": "Total number of memories",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "total"
        ],
        "type": "object"
      },
      "MemoryUpdateDto": {
        "properties": {
          "assetOrder": {
            "description": "The memory's items in the order the owner chose; items not listed follow in capture order",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 5000,
            "type": "array"
          },
          "isHidden": {
            "description": "Hide the memory from the memories list; false restores it",
            "type": "boolean"
          },
          "isSaved": {
            "description": "Is memory saved",
            "type": "boolean"
          },
          "memoryAt": {
            "description": "Memory date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "seenAt": {
            "description": "Date when memory was seen",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "title": {
            "description": "The owner's own title for the memory; null returns to the generated one",
            "maxLength": 200,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "MemoryExportCreateDto": {
        "properties": {
          "format": {
            "$ref": "#/components/schemas/MemoryExportFormat",
            "description": "Export format, defaults to an archive of the originals"
          },
          "highlight": {
            "$ref": "#/components/schemas/MemoryHighlightOptionsDto",
            "description": "Options for a `highlight` export"
          }
        },
        "type": "object"
      },
      "MemoryHighlightOptionsDto": {
        "properties": {
          "audio": {
            "$ref": "#/components/schemas/MemoryHighlightAudio",
            "description": "Sound policy, each video's own sound by default"
          },
          "destination": {
            "$ref": "#/components/schemas/MemoryHighlightDestination",
            "description": "Where it renders, this server by default"
          },
          "lengthSeconds": {
            "description": "Target length in seconds, 60 by default",
            "maximum": 300,
            "minimum": 15,
            "type": "integer"
          },
          "resolution": {
            "$ref": "#/components/schemas/StudioExportResolution",
            "description": "Output resolution, 2160p by default"
          }
        },
        "type": "object"
      },
      "NotificationDeleteAllDto": {
        "properties": {
          "ids": {
            "description": "Notification IDs to delete",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "ids"
        ],
        "type": "object"
      },
      "NotificationUpdateAllDto": {
        "properties": {
          "ids": {
            "description": "Notification IDs to update",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          },
          "readAt": {
            "description": "Date when notifications were read",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          }
        },
        "required": [
          "ids"
        ],
        "type": "object"
      },
      "NotificationUpdateDto": {
        "properties": {
          "readAt": {
            "description": "Date when notification was read",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "PartnerResponseDto": {
        "description": "Partner response",
        "properties": {
          "avatarColor": {
            "$ref": "#/components/schemas/UserAvatarColor"
          },
          "backfill": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PartnerBackfillDto"
              }
            ],
            "description": "copy progress of the library shared this way; null when it was never copied",
            "nullable": true
          },
          "email": {
            "description": "User email",
            "format": "email",
            "pattern": "^[\\p{L}\\p{M}\\p{N}.!#$%&'*+/=?^_`{|}~-]+@[\\p{L}\\p{N}](?:[\\p{L}\\p{M}\\p{N}-]{0,61}[\\p{L}\\p{M}\\p{N}])?(?:\\.[\\p{L}\\p{N}](?:[\\p{L}\\p{M}\\p{N}-]{0,61}[\\p{L}\\p{M}\\p{N}])?)*$",
            "type": "string"
          },
          "id": {
            "description": "User ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "description": "User name",
            "type": "string"
          },
          "profileChangedAt": {
            "description": "Profile change date",
            "format": "date-time",
            "type": "string"
          },
          "profileImagePath": {
            "description": "Profile image path",
            "type": "string"
          }
        },
        "required": [
          "avatarColor",
          "email",
          "id",
          "name",
          "profileChangedAt",
          "profileImagePath"
        ],
        "type": "object"
      },
      "PartnerBackfillDto": {
        "properties": {
          "done": {
            "description": "Items copied so far",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "state": {
            "description": "Where the first copy stands",
            "enum": [
              "pending",
              "running",
              "done",
              "stopped"
            ],
            "type": "string"
          },
          "total": {
            "description": "Items to copy",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "done",
          "state",
          "total"
        ],
        "type": "object"
      },
      "PartnerDirection": {
        "description": "Partner direction",
        "enum": [
          "shared-by",
          "shared-with"
        ],
        "type": "string"
      },
      "PartnerCreateDto": {
        "properties": {
          "sharedWithId": {
            "description": "User ID to share with",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "sharedWithId"
        ],
        "type": "object"
      },
      "PartnerLockedNoticeResponseDto": {
        "properties": {
          "flaggedAt": {
            "description": "When the first Locked item arrived for an account without a PIN",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "show": {
            "description": "Whether to show the notice: Locked items arrived from a partner, no PIN is set, and it was not dismissed",
            "type": "boolean"
          }
        },
        "required": [
          "flaggedAt",
          "show"
        ],
        "type": "object"
      },
      "PartnerUpdateDto": {
        "properties": {},
        "type": "object"
      },
      "PeopleResponseDto": {
        "description": "People response",
        "properties": {
          "hasNextPage": {
            "description": "Whether there are more pages",
            "type": "boolean"
          },
          "hidden": {
            "description": "Number of hidden people",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "people": {
            "items": {
              "$ref": "#/components/schemas/PeopleListItemDto"
            },
            "type": "array"
          },
          "total": {
            "description": "Total number of people",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "hidden",
          "people",
          "total"
        ],
        "type": "object"
      },
      "PeopleListItemDto": {
        "properties": {
          "assetCount": {
            "description": "Number of timeline assets showing this person",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "birthDate": {
            "description": "Person date of birth",
            "format": "date",
            "nullable": true,
            "type": "string"
          },
          "color": {
            "description": "Person color (hex)",
            "type": "string"
          },
          "featuredAssetId": {
            "description": "The photo the person's featured face is in (). Returned only to the person's owner, by GET and PUT /people/:id; null when there is none, when it is another account's photo, or when it may not be shown (trashed, hidden, Locked, a removed or invisible face, or hidden as NSFW)",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "id": {
            "description": "Person ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isFavorite": {
            "description": "Is favorite",
            "type": "boolean"
          },
          "isHidden": {
            "description": "Is hidden",
            "type": "boolean"
          },
          "lastSeenAt": {
            "description": "Capture date of the most recent timeline asset showing this person",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "name": {
            "description": "Person name",
            "type": "string"
          },
          "thumbnailPath": {
            "description": "Thumbnail path",
            "type": "string"
          },
          "updatedAt": {
            "description": "Last update date",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "assetCount",
          "birthDate",
          "id",
          "isHidden",
          "lastSeenAt",
          "name",
          "thumbnailPath"
        ],
        "type": "object"
      },
      "PersonCreateDto": {
        "properties": {
          "birthDate": {
            "description": "Person date of birth",
            "format": "date",
            "nullable": true,
            "type": "string"
          },
          "color": {
            "description": "Person color (hex)",
            "nullable": true,
            "pattern": "^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$",
            "type": "string"
          },
          "isFavorite": {
            "description": "Mark as favorite",
            "type": "boolean"
          },
          "isHidden": {
            "description": "Person visibility (hidden)",
            "type": "boolean"
          },
          "name": {
            "description": "Person name",
            "type": "string"
          }
        },
        "type": "object"
      },
      "PeopleUpdateDto": {
        "properties": {
          "people": {
            "description": "People to update",
            "items": {
              "$ref": "#/components/schemas/PeopleUpdateItem"
            },
            "type": "array"
          }
        },
        "required": [
          "people"
        ],
        "type": "object"
      },
      "PeopleUpdateItem": {
        "properties": {
          "birthDate": {
            "description": "Person date of birth",
            "format": "date",
            "nullable": true,
            "type": "string"
          },
          "color": {
            "description": "Person color (hex)",
            "nullable": true,
            "pattern": "^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$",
            "type": "string"
          },
          "featureFaceAssetId": {
            "description": "Asset ID used for feature face thumbnail",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "id": {
            "description": "Person ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isFavorite": {
            "description": "Mark as favorite",
            "type": "boolean"
          },
          "isHidden": {
            "description": "Person visibility (hidden)",
            "type": "boolean"
          },
          "name": {
            "description": "Person name",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "PersonCorrectionDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/PersonCorrectionAction"
          },
          "createdAt": {
            "description": "When the decision was made",
            "format": "date-time",
            "type": "string"
          },
          "evidence": {
            "allOf": [
              {
                "$ref": "#/components/schemas/FaceEvidenceDto"
              }
            ],
            "description": "The photo and face, when it may still be shown",
            "nullable": true
          },
          "evidenceRevoked": {
            "description": "True when the decision was about a photo that can no longer be shown (trashed, Locked, hidden)",
            "type": "boolean"
          },
          "fromPerson": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PersonCorrectionPersonDto"
              }
            ],
            "description": "Who the face belonged to before",
            "nullable": true
          },
          "id": {
            "description": "Correction ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "toPerson": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PersonCorrectionPersonDto"
              }
            ],
            "description": "Who the face belongs to after",
            "nullable": true
          },
          "undoable": {
            "description": "Whether this kind of decision can be undone and has not been",
            "type": "boolean"
          },
          "undoneAt": {
            "description": "When the decision was undone",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "action",
          "createdAt",
          "evidence",
          "evidenceRevoked",
          "fromPerson",
          "id",
          "toPerson",
          "undoable",
          "undoneAt"
        ],
        "type": "object"
      },
      "PersonCorrectionPersonDto": {
        "properties": {
          "exists": {
            "description": "Whether the person still exists",
            "type": "boolean"
          },
          "id": {
            "description": "Person ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "description": "The current name, or the name at the time when the person no longer exists",
            "type": "string"
          }
        },
        "required": [
          "exists",
          "id",
          "name"
        ],
        "type": "object"
      },
      "FaceEvidenceDto": {
        "properties": {
          "assetId": {
            "description": "The complete photo the face is in",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "box": {
            "description": "Where the face is in the photo",
            "nullable": true,
            "properties": {
              "height": {
                "description": "Height, as a fraction of the photo height",
                "format": "double",
                "type": "number"
              },
              "width": {
                "description": "Width, as a fraction of the photo width",
                "format": "double",
                "type": "number"
              },
              "x": {
                "description": "Left edge, as a fraction of the photo width",
                "format": "double",
                "type": "number"
              },
              "y": {
                "description": "Top edge, as a fraction of the photo height",
                "format": "double",
                "type": "number"
              }
            },
            "required": [
              "x",
              "y",
              "width",
              "height"
            ],
            "type": "object"
          },
          "faceId": {
            "description": "The face, when it still exists",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "assetId",
          "box",
          "faceId"
        ],
        "type": "object"
      },
      "PersonCorrectionAction": {
        "description": "What the decision did",
        "enum": [
          "reassign",
          "new-person",
          "unassign",
          "remove",
          "merge",
          "box-move",
          "partner-merge"
        ],
        "type": "string"
      },
      "MergePersonDto": {
        "properties": {
          "ids": {
            "description": "Person IDs to merge",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "ids"
        ],
        "type": "object"
      },
      "MergeSuggestionsResponseDto": {
        "properties": {
          "suggestions": {
            "description": "Suggested pairs of people that may be the same person",
            "items": {
              "$ref": "#/components/schemas/PersonMergeSuggestionDto"
            },
            "type": "array"
          }
        },
        "required": [
          "suggestions"
        ],
        "type": "object"
      },
      "PersonMergeSuggestionDto": {
        "properties": {
          "distance": {
            "description": "Face embedding distance between the two people (lower is more similar)",
            "format": "double",
            "minimum": 0,
            "type": "number"
          },
          "person": {
            "$ref": "#/components/schemas/PersonResponseDto",
            "description": "The person being reviewed"
          },
          "personEvidence": {
            "allOf": [
              {
                "$ref": "#/components/schemas/FaceEvidenceDto"
              }
            ],
            "description": "The reviewed person's reference face and its complete photo, or null when none may be shown",
            "nullable": true
          },
          "suggestion": {
            "$ref": "#/components/schemas/PersonResponseDto",
            "description": "The suggested match for that person"
          },
          "suggestionEvidence": {
            "allOf": [
              {
                "$ref": "#/components/schemas/FaceEvidenceDto"
              }
            ],
            "description": "The suggested person's reference face and its complete photo, or null when none may be shown",
            "nullable": true
          }
        },
        "required": [
          "distance",
          "person",
          "personEvidence",
          "suggestion",
          "suggestionEvidence"
        ],
        "type": "object"
      },
      "PersonMergeVerdictDeleteDto": {
        "properties": {
          "personId": {
            "description": "One person of the suggested pair (the reviewed person, for \"ignore\")",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "suggestionId": {
            "description": "The other person of the suggested pair",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "personId",
          "suggestionId"
        ],
        "type": "object"
      },
      "PersonMergeVerdictResponseDto": {
        "properties": {
          "createdAt": {
            "description": "When the verdict was recorded",
            "format": "date-time",
            "type": "string"
          },
          "personId": {
            "description": "The person of the pair whose id sorts first; the ignored person for \"ignore\"; the surviving person for \"same\"",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "suggestionId": {
            "description": "The other person of the pair; the ignored person again for \"ignore\"; the merged person for \"same\"",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "verdict": {
            "$ref": "#/components/schemas/PersonMergeVerdict"
          }
        },
        "required": [
          "createdAt",
          "personId",
          "suggestionId",
          "verdict"
        ],
        "type": "object"
      },
      "PersonMergeVerdict": {
        "description": "\"same\": merge the two people now (the named one survives, or `personId` when both or neither are named); \"different\": never suggest this pair again; \"later\": skip it for 30 days; \"ignore\": stop suggesting `personId` with anyone",
        "enum": [
          "same",
          "different",
          "later",
          "ignore"
        ],
        "type": "string"
      },
      "PersonMergeVerdictCreateDto": {
        "properties": {
          "personId": {
            "description": "One person of the suggested pair (the reviewed person, for \"ignore\")",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "suggestionId": {
            "description": "The other person of the suggested pair",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "verdict": {
            "$ref": "#/components/schemas/PersonMergeVerdict"
          }
        },
        "required": [
          "personId",
          "suggestionId",
          "verdict"
        ],
        "type": "object"
      },
      "PersonUpdateDto": {
        "properties": {
          "birthDate": {
            "description": "Person date of birth",
            "format": "date",
            "nullable": true,
            "type": "string"
          },
          "color": {
            "description": "Person color (hex)",
            "nullable": true,
            "pattern": "^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$",
            "type": "string"
          },
          "featureFaceAssetId": {
            "description": "Asset ID used for feature face thumbnail",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isFavorite": {
            "description": "Mark as favorite",
            "type": "boolean"
          },
          "isHidden": {
            "description": "Person visibility (hidden)",
            "type": "boolean"
          },
          "name": {
            "description": "Person name",
            "type": "string"
          }
        },
        "type": "object"
      },
      "PersonCorrectionsResponseDto": {
        "properties": {
          "corrections": {
            "description": "Manual face decisions for this person, most recent first",
            "items": {
              "$ref": "#/components/schemas/PersonCorrectionDto"
            },
            "type": "array"
          },
          "hasNextPage": {
            "description": "Whether there are more pages",
            "type": "boolean"
          }
        },
        "required": [
          "corrections",
          "hasNextPage"
        ],
        "type": "object"
      },
      "AssetFaceUpdateDto": {
        "properties": {
          "data": {
            "description": "Face update items",
            "items": {
              "$ref": "#/components/schemas/AssetFaceUpdateItem"
            },
            "type": "array"
          }
        },
        "required": [
          "data"
        ],
        "type": "object"
      },
      "AssetFaceUpdateItem": {
        "properties": {
          "assetId": {
            "description": "Asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "personId": {
            "description": "Person ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "assetId",
          "personId"
        ],
        "type": "object"
      },
      "PersonStatisticsResponseDto": {
        "properties": {
          "assets": {
            "description": "Number of assets",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "photos": {
            "description": "Number of photos among the assets",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "videos": {
            "description": "Number of videos among the assets",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "assets",
          "photos",
          "videos"
        ],
        "type": "object"
      },
      "PetResponseDto": {
        "properties": {
          "assetCount": {
            "description": "Number of assets with a confirmed observation of this pet",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "birthDate": {
            "description": "Pet date of birth",
            "format": "date",
            "nullable": true,
            "type": "string"
          },
          "createdAt": {
            "description": "Creation date",
            "format": "date-time",
            "type": "string"
          },
          "featuredAssetId": {
            "description": "Asset used as the pet thumbnail",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "id": {
            "description": "Pet ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isFavorite": {
            "description": "Is favorite",
            "type": "boolean"
          },
          "isHidden": {
            "description": "Is hidden",
            "type": "boolean"
          },
          "name": {
            "description": "Pet name",
            "type": "string"
          },
          "species": {
            "$ref": "#/components/schemas/PetSpecies"
          },
          "updatedAt": {
            "description": "Last update date",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "assetCount",
          "birthDate",
          "createdAt",
          "featuredAssetId",
          "id",
          "isFavorite",
          "isHidden",
          "name",
          "species",
          "updatedAt"
        ],
        "type": "object"
      },
      "PetSpecies": {
        "description": "Pet species",
        "enum": [
          "cat",
          "dog",
          "bird",
          "rabbit",
          "horse",
          "reptile",
          "fish",
          "small_mammal",
          "other"
        ],
        "type": "string"
      },
      "PetCreateDto": {
        "properties": {
          "birthDate": {
            "description": "Pet date of birth",
            "format": "date",
            "nullable": true,
            "type": "string"
          },
          "featuredAssetId": {
            "description": "Asset used as the pet thumbnail",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isFavorite": {
            "description": "Mark as favorite",
            "type": "boolean"
          },
          "isHidden": {
            "description": "Pet visibility (hidden)",
            "type": "boolean"
          },
          "name": {
            "description": "Pet name",
            "maxLength": 100,
            "type": "string"
          },
          "species": {
            "$ref": "#/components/schemas/PetSpecies",
            "default": "other"
          }
        },
        "type": "object"
      },
      "PetObservationResponseDto": {
        "properties": {
          "assetId": {
            "description": "Asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "boundingBoxX1": {
            "description": "Region X1, in source pixels",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "boundingBoxX2": {
            "description": "Region X2, in source pixels",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "boundingBoxY1": {
            "description": "Region Y1, in source pixels",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "boundingBoxY2": {
            "description": "Region Y2, in source pixels",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "createdAt": {
            "description": "Creation date",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "Observation ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "imageHeight": {
            "description": "Height of the image the region was drawn on",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "imageWidth": {
            "description": "Width of the image the region was drawn on",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "petId": {
            "description": "Pet ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "source": {
            "$ref": "#/components/schemas/PetObservationSource"
          },
          "sourceChecksum": {
            "description": "Checksum (base64) of the original when the decision was made; null for older decisions",
            "nullable": true,
            "type": "string"
          },
          "staleAt": {
            "description": "When the original was replaced under a drawn region, which then needs review; null when current",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/PetObservationState"
          },
          "updatedAt": {
            "description": "Last update date",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "assetId",
          "boundingBoxX1",
          "boundingBoxX2",
          "boundingBoxY1",
          "boundingBoxY2",
          "createdAt",
          "id",
          "imageHeight",
          "imageWidth",
          "petId",
          "source",
          "sourceChecksum",
          "staleAt",
          "state",
          "updatedAt"
        ],
        "type": "object"
      },
      "PetObservationState": {
        "description": "Pet observation state",
        "enum": [
          "confirmed",
          "rejected"
        ],
        "type": "string"
      },
      "PetObservationSource": {
        "description": "How a pet observation was recorded",
        "enum": [
          "manual",
          "review"
        ],
        "type": "string"
      },
      "PetCandidateReviewDto": {
        "properties": {
          "expectedChecksum": {
            "description": "Checksum of the original the decision was made on (base64); refused with 409 when it changed",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "petId": {
            "description": "Pet to assign instead of the proposed one",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "PetCandidateRejectDto": {
        "properties": {
          "expectedChecksum": {
            "description": "Checksum of the original the decision was made on (base64); refused with 409 when it changed",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          }
        },
        "type": "object"
      },
      "PetUpdateDto": {
        "properties": {
          "birthDate": {
            "description": "Pet date of birth",
            "format": "date",
            "nullable": true,
            "type": "string"
          },
          "featuredAssetId": {
            "description": "Asset used as the pet thumbnail",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isFavorite": {
            "description": "Mark as favorite",
            "type": "boolean"
          },
          "isHidden": {
            "description": "Pet visibility (hidden)",
            "type": "boolean"
          },
          "name": {
            "description": "Pet name",
            "maxLength": 100,
            "type": "string"
          },
          "species": {
            "$ref": "#/components/schemas/PetSpecies"
          }
        },
        "type": "object"
      },
      "PetMergeDto": {
        "properties": {
          "ids": {
            "description": "Pet IDs to merge into this pet",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "ids"
        ],
        "type": "object"
      },
      "PetObservationCreateDto": {
        "properties": {
          "assetId": {
            "description": "Asset the pet appears in",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "boundingBoxX1": {
            "description": "Region X1, in source pixels",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "boundingBoxX2": {
            "description": "Region X2, in source pixels",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "boundingBoxY1": {
            "description": "Region Y1, in source pixels",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "boundingBoxY2": {
            "description": "Region Y2, in source pixels",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "expectedChecksum": {
            "description": "Checksum of the original the decision was made on (base64); refused with 409 when it changed",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "imageHeight": {
            "description": "Height of the image the region was drawn on",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "imageWidth": {
            "description": "Width of the image the region was drawn on",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "assetId"
        ],
        "type": "object"
      },
      "PhotographyGalleryDto": {
        "properties": {
          "brand": {
            "properties": {
              "background": {
                "type": "string"
              },
              "color": {
                "type": "string"
              },
              "email": {
                "type": "string"
              },
              "font": {
                "type": "string"
              },
              "logoUrl": {
                "nullable": true,
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "phone": {
                "type": "string"
              },
              "tagline": {
                "type": "string"
              },
              "textColor": {
                "type": "string"
              }
            },
            "required": [
              "name",
              "tagline",
              "email",
              "phone",
              "color",
              "background",
              "textColor",
              "font",
              "logoUrl"
            ],
            "type": "object"
          },
          "chapters": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "coverCaptureId": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "description": {
                  "maxLength": 2000,
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "position": {
                  "maximum": 10000,
                  "minimum": 0,
                  "type": "integer"
                },
                "title": {
                  "maxLength": 200,
                  "minLength": 1,
                  "type": "string"
                }
              },
              "required": [
                "id",
                "title",
                "description",
                "position",
                "coverCaptureId"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "checkoutAvailable": {
            "type": "boolean"
          },
          "choices": {
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 10000,
            "type": "array"
          },
          "mode": {
            "enum": [
              "edited-delivery",
              "select-before-editing",
              "sell-by-photo"
            ],
            "type": "string"
          },
          "notes": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "annotations": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "height": {
                        "maximum": 1,
                        "minimum": 0,
                        "type": "number"
                      },
                      "text": {
                        "maxLength": 500,
                        "type": "string"
                      },
                      "width": {
                        "maximum": 1,
                        "minimum": 0,
                        "type": "number"
                      },
                      "x": {
                        "maximum": 1,
                        "minimum": 0,
                        "type": "number"
                      },
                      "y": {
                        "maximum": 1,
                        "minimum": 0,
                        "type": "number"
                      }
                    },
                    "required": [
                      "x",
                      "y",
                      "width",
                      "height",
                      "text"
                    ],
                    "type": "object"
                  },
                  "maxItems": 20,
                  "type": "array"
                },
                "captureId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "text": {
                  "maxLength": 2000,
                  "type": "string"
                }
              },
              "required": [
                "captureId",
                "text"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "orders": {
            "items": {
              "properties": {
                "acceptedAt": {
                  "nullable": true,
                  "type": "string"
                },
                "captureIds": {
                  "items": {
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                    "type": "string"
                  },
                  "maxItems": 10000,
                  "type": "array"
                },
                "createdAt": {
                  "type": "string"
                },
                "currency": {
                  "type": "string"
                },
                "editingBlocked": {
                  "type": "boolean"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "items": {
                  "items": {
                    "properties": {
                      "approved": {
                        "type": "boolean"
                      },
                      "captureId": {
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "clientApprovalRequired": {
                        "type": "boolean"
                      },
                      "exportSpec": {
                        "properties": {
                          "format": {
                            "enum": [
                              "jpeg"
                            ],
                            "type": "string"
                          },
                          "maxEdge": {
                            "maximum": 65535,
                            "minimum": 320,
                            "type": "integer"
                          },
                          "quality": {
                            "enum": [
                              90
                            ],
                            "type": "number"
                          }
                        },
                        "required": [
                          "format",
                          "quality",
                          "maxEdge"
                        ],
                        "type": "object"
                      },
                      "outputs": {
                        "items": {
                          "properties": {
                            "approvalPreviewUrl": {
                              "nullable": true,
                              "type": "string"
                            },
                            "approved": {
                              "type": "boolean"
                            },
                            "blockedReason": {
                              "enum": [
                                "permission",
                                "order",
                                "payment",
                                "approval",
                                "render"
                              ],
                              "nullable": true,
                              "type": "string"
                            },
                            "branded": {
                              "type": "boolean"
                            },
                            "canDownload": {
                              "type": "boolean"
                            },
                            "clientApprovalRequired": {
                              "type": "boolean"
                            },
                            "exportSpec": {
                              "properties": {
                                "format": {
                                  "enum": [
                                    "jpeg"
                                  ],
                                  "type": "string"
                                },
                                "maxEdge": {
                                  "maximum": 65535,
                                  "minimum": 320,
                                  "type": "integer"
                                },
                                "quality": {
                                  "enum": [
                                    90
                                  ],
                                  "type": "number"
                                }
                              },
                              "required": [
                                "format",
                                "quality",
                                "maxEdge"
                              ],
                              "type": "object"
                            },
                            "id": {
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                              "type": "string"
                            },
                            "kind": {
                              "enum": [
                                "print",
                                "web",
                                "social"
                              ],
                              "type": "string"
                            },
                            "label": {
                              "type": "string"
                            },
                            "ready": {
                              "type": "boolean"
                            },
                            "renderStatus": {
                              "enum": [
                                "awaiting-approval",
                                "preparing",
                                "ready"
                              ],
                              "type": "string"
                            },
                            "revisionId": {
                              "format": "uuid",
                              "nullable": true,
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                              "type": "string"
                            },
                            "url": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "id",
                            "label",
                            "kind",
                            "revisionId",
                            "approved",
                            "clientApprovalRequired",
                            "ready",
                            "renderStatus",
                            "branded",
                            "approvalPreviewUrl",
                            "exportSpec",
                            "url"
                          ],
                          "type": "object"
                        },
                        "type": "array"
                      },
                      "ready": {
                        "type": "boolean"
                      },
                      "revisionId": {
                        "format": "uuid",
                        "nullable": true,
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      }
                    },
                    "required": [
                      "captureId",
                      "revisionId",
                      "approved",
                      "clientApprovalRequired",
                      "ready",
                      "exportSpec",
                      "outputs"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "paymentTiming": {
                  "enum": [
                    "before-editing",
                    "after-approval"
                  ],
                  "type": "string"
                },
                "pricing": {
                  "properties": {
                    "additionalPrice": {
                      "maximum": 100000000,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "bundles": {
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "count": {
                            "maximum": 10000,
                            "minimum": 1,
                            "type": "integer"
                          },
                          "price": {
                            "maximum": 100000000,
                            "minimum": 0,
                            "type": "integer"
                          }
                        },
                        "required": [
                          "count",
                          "price"
                        ],
                        "type": "object"
                      },
                      "maxItems": 20,
                      "type": "array"
                    },
                    "collectionPrice": {
                      "maximum": 100000000,
                      "minimum": 0,
                      "nullable": true,
                      "type": "integer"
                    },
                    "includedCount": {
                      "maximum": 9007199254740991,
                      "minimum": -9007199254740991,
                      "type": "integer"
                    },
                    "option": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "includedCount",
                    "additionalPrice",
                    "collectionPrice",
                    "bundles",
                    "option"
                  ],
                  "type": "object"
                },
                "readyCount": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "type": "integer"
                },
                "recipientId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "roundId": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "status": {
                  "enum": [
                    "quoted",
                    "accepted",
                    "settled",
                    "free",
                    "refunded",
                    "cancelled"
                  ],
                  "type": "string"
                },
                "terms": {
                  "type": "string"
                },
                "total": {
                  "maximum": 100000000,
                  "minimum": 0,
                  "type": "integer"
                }
              },
              "required": [
                "id",
                "recipientId",
                "roundId",
                "status",
                "currency",
                "total",
                "captureIds",
                "terms",
                "paymentTiming",
                "pricing",
                "createdAt",
                "acceptedAt",
                "items",
                "readyCount",
                "editingBlocked"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "photos": {
            "items": {
              "properties": {
                "approvalRevisionId": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "blockedReason": {
                  "enum": [
                    "permission",
                    "order",
                    "payment",
                    "approval",
                    "render"
                  ],
                  "nullable": true,
                  "type": "string"
                },
                "canDownload": {
                  "type": "boolean"
                },
                "chapterId": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "number": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "type": "integer"
                },
                "outputs": {
                  "items": {
                    "properties": {
                      "approvalPreviewUrl": {
                        "nullable": true,
                        "type": "string"
                      },
                      "approved": {
                        "type": "boolean"
                      },
                      "blockedReason": {
                        "enum": [
                          "permission",
                          "order",
                          "payment",
                          "approval",
                          "render"
                        ],
                        "nullable": true,
                        "type": "string"
                      },
                      "branded": {
                        "type": "boolean"
                      },
                      "canDownload": {
                        "type": "boolean"
                      },
                      "clientApprovalRequired": {
                        "type": "boolean"
                      },
                      "exportSpec": {
                        "properties": {
                          "format": {
                            "enum": [
                              "jpeg"
                            ],
                            "type": "string"
                          },
                          "maxEdge": {
                            "maximum": 65535,
                            "minimum": 320,
                            "type": "integer"
                          },
                          "quality": {
                            "enum": [
                              90
                            ],
                            "type": "number"
                          }
                        },
                        "required": [
                          "format",
                          "quality",
                          "maxEdge"
                        ],
                        "type": "object"
                      },
                      "id": {
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "kind": {
                        "enum": [
                          "print",
                          "web",
                          "social"
                        ],
                        "type": "string"
                      },
                      "label": {
                        "type": "string"
                      },
                      "ready": {
                        "type": "boolean"
                      },
                      "renderStatus": {
                        "enum": [
                          "awaiting-approval",
                          "preparing",
                          "ready"
                        ],
                        "type": "string"
                      },
                      "revisionId": {
                        "format": "uuid",
                        "nullable": true,
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "url": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "id",
                      "label",
                      "kind",
                      "revisionId",
                      "approved",
                      "clientApprovalRequired",
                      "ready",
                      "renderStatus",
                      "branded",
                      "approvalPreviewUrl",
                      "exportSpec",
                      "url"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "previewUrl": {
                  "type": "string"
                },
                "status": {
                  "enum": [
                    "imported",
                    "selected",
                    "approval-requested",
                    "approved",
                    "delivered"
                  ],
                  "type": "string"
                },
                "thumbnailUrl": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "number",
                "chapterId",
                "status",
                "previewUrl",
                "thumbnailUrl",
                "canDownload",
                "blockedReason",
                "approvalRevisionId",
                "outputs"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "presentation": {
            "additionalProperties": false,
            "properties": {
              "blocks": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "captureIds": {
                      "items": {
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "maxItems": 1000,
                      "type": "array"
                    },
                    "chapterId": {
                      "format": "uuid",
                      "nullable": true,
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "id": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "selection": {
                      "enum": [
                        "automatic",
                        "explicit"
                      ],
                      "type": "string"
                    },
                    "text": {
                      "maxLength": 2000,
                      "type": "string"
                    },
                    "type": {
                      "enum": [
                        "chapter",
                        "grid",
                        "full",
                        "pair",
                        "caption",
                        "slideshow"
                      ],
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "type",
                    "chapterId",
                    "captureIds",
                    "text"
                  ],
                  "type": "object"
                },
                "maxItems": 100,
                "type": "array"
              },
              "coverCaptureId": {
                "format": "uuid",
                "nullable": true,
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "coverFocal": {
                "maximum": 100,
                "minimum": 0,
                "type": "number"
              },
              "coverTreatment": {
                "enum": [
                  "full",
                  "split",
                  "quiet"
                ],
                "type": "string"
              },
              "font": {
                "enum": [
                  "editorial",
                  "modern",
                  "script"
                ],
                "type": "string"
              },
              "introduction": {
                "maxLength": 5000,
                "type": "string"
              },
              "palette": {
                "enum": [
                  "studio",
                  "ivory",
                  "charcoal"
                ],
                "type": "string"
              },
              "showChapters": {
                "type": "boolean"
              },
              "showNumbers": {
                "type": "boolean"
              },
              "spacing": {
                "enum": [
                  "compact",
                  "comfortable",
                  "airy"
                ],
                "type": "string"
              },
              "template": {
                "enum": [
                  "wedding",
                  "portrait",
                  "fine-art",
                  "proofing"
                ],
                "type": "string"
              }
            },
            "required": [
              "template",
              "coverCaptureId",
              "coverTreatment",
              "coverFocal",
              "font",
              "palette",
              "spacing",
              "introduction",
              "showChapters",
              "showNumbers"
            ],
            "type": "object"
          },
          "pricing": {
            "properties": {
              "additionalPrice": {
                "maximum": 100000000,
                "minimum": 0,
                "type": "integer"
              },
              "bundles": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "count": {
                      "maximum": 10000,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "price": {
                      "maximum": 100000000,
                      "minimum": 0,
                      "type": "integer"
                    }
                  },
                  "required": [
                    "count",
                    "price"
                  ],
                  "type": "object"
                },
                "maxItems": 20,
                "type": "array"
              },
              "collectionPrice": {
                "maximum": 100000000,
                "minimum": 0,
                "nullable": true,
                "type": "integer"
              },
              "currency": {
                "type": "string"
              },
              "includedCount": {
                "maximum": 9007199254740991,
                "minimum": -9007199254740991,
                "type": "integer"
              },
              "selectionDeadline": {
                "format": "date-time",
                "nullable": true,
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                "type": "string"
              },
              "terms": {
                "type": "string"
              }
            },
            "required": [
              "currency",
              "includedCount",
              "additionalPrice",
              "collectionPrice",
              "bundles",
              "terms",
              "selectionDeadline"
            ],
            "type": "object"
          },
          "publication": {
            "nullable": true,
            "properties": {
              "completed": {
                "maximum": 9007199254740991,
                "minimum": -9007199254740991,
                "type": "integer"
              },
              "error": {
                "nullable": true,
                "type": "string"
              },
              "failedCaptureId": {
                "format": "uuid",
                "nullable": true,
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "id": {
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "status": {
                "enum": [
                  "queued",
                  "rendering",
                  "ready",
                  "failed"
                ],
                "type": "string"
              },
              "total": {
                "maximum": 9007199254740991,
                "minimum": -9007199254740991,
                "type": "integer"
              }
            },
            "required": [
              "id",
              "status",
              "completed",
              "total",
              "error",
              "failedCaptureId"
            ],
            "type": "object"
          },
          "publishedGenerationId": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "receipts": {
            "items": {
              "properties": {
                "action": {
                  "type": "string"
                },
                "createdAt": {
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "orderId": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "recipientId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "reference": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "orderId",
                "recipientId",
                "action",
                "reference",
                "createdAt"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "recipient": {
            "properties": {
              "canDownload": {
                "type": "boolean"
              },
              "id": {
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "id",
              "name",
              "canDownload"
            ],
            "type": "object"
          },
          "revision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "rounds": {
            "items": {
              "properties": {
                "captureIds": {
                  "items": {
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                    "type": "string"
                  },
                  "maxItems": 10000,
                  "type": "array"
                },
                "createdAt": {
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "notes": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "annotations": {
                        "items": {
                          "additionalProperties": false,
                          "properties": {
                            "height": {
                              "maximum": 1,
                              "minimum": 0,
                              "type": "number"
                            },
                            "text": {
                              "maxLength": 500,
                              "type": "string"
                            },
                            "width": {
                              "maximum": 1,
                              "minimum": 0,
                              "type": "number"
                            },
                            "x": {
                              "maximum": 1,
                              "minimum": 0,
                              "type": "number"
                            },
                            "y": {
                              "maximum": 1,
                              "minimum": 0,
                              "type": "number"
                            }
                          },
                          "required": [
                            "x",
                            "y",
                            "width",
                            "height",
                            "text"
                          ],
                          "type": "object"
                        },
                        "maxItems": 20,
                        "type": "array"
                      },
                      "captureId": {
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "text": {
                        "maxLength": 2000,
                        "type": "string"
                      }
                    },
                    "required": [
                      "captureId",
                      "text"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "number": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "type": "integer"
                },
                "recipientId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                }
              },
              "required": [
                "id",
                "recipientId",
                "number",
                "captureIds",
                "notes",
                "createdAt"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "brand",
          "chapters",
          "checkoutAvailable",
          "choices",
          "mode",
          "notes",
          "orders",
          "photos",
          "presentation",
          "pricing",
          "publication",
          "publishedGenerationId",
          "receipts",
          "recipient",
          "revision",
          "rounds",
          "title"
        ],
        "type": "object"
      },
      "PhotographyGuestApprovalDto": {
        "additionalProperties": false,
        "properties": {
          "approved": {
            "type": "boolean"
          },
          "captureId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "expectedRevision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "note": {
            "maxLength": 2000,
            "type": "string"
          },
          "revisionId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "approved",
          "captureId",
          "expectedRevision",
          "note",
          "revisionId"
        ],
        "type": "object"
      },
      "PhotographyChoicesDto": {
        "additionalProperties": false,
        "properties": {
          "captureIds": {
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 10000,
            "type": "array"
          },
          "expectedRevision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "notes": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "annotations": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "height": {
                        "maximum": 1,
                        "minimum": 0,
                        "type": "number"
                      },
                      "text": {
                        "maxLength": 500,
                        "type": "string"
                      },
                      "width": {
                        "maximum": 1,
                        "minimum": 0,
                        "type": "number"
                      },
                      "x": {
                        "maximum": 1,
                        "minimum": 0,
                        "type": "number"
                      },
                      "y": {
                        "maximum": 1,
                        "minimum": 0,
                        "type": "number"
                      }
                    },
                    "required": [
                      "x",
                      "y",
                      "width",
                      "height",
                      "text"
                    ],
                    "type": "object"
                  },
                  "maxItems": 20,
                  "type": "array"
                },
                "captureId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "text": {
                  "maxLength": 2000,
                  "type": "string"
                }
              },
              "required": [
                "captureId",
                "text"
              ],
              "type": "object"
            },
            "maxItems": 10000,
            "type": "array"
          }
        },
        "required": [
          "captureIds",
          "expectedRevision",
          "notes"
        ],
        "type": "object"
      },
      "PhotographyOrderAcceptDto": {
        "additionalProperties": false,
        "properties": {
          "expectedRevision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          }
        },
        "required": [
          "expectedRevision"
        ],
        "type": "object"
      },
      "PhotographyCheckoutDto": {
        "properties": {
          "url": {
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "type": "object"
      },
      "PhotographyGallerySessionResponseDto": {
        "properties": {
          "expiresAt": {
            "type": "string"
          },
          "recipientId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "session": {
            "type": "string"
          }
        },
        "required": [
          "expiresAt",
          "recipientId",
          "session"
        ],
        "type": "object"
      },
      "PhotographyGallerySessionDto": {
        "additionalProperties": false,
        "properties": {
          "password": {
            "maxLength": 72,
            "type": "string"
          },
          "token": {
            "pattern": "^[a-f0-9]{64}$",
            "type": "string"
          }
        },
        "required": [
          "token"
        ],
        "type": "object"
      },
      "PhotographyWorkflowMutationDto": {
        "additionalProperties": false,
        "properties": {
          "expectedRevision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          }
        },
        "required": [
          "expectedRevision"
        ],
        "type": "object"
      },
      "PhotographyZipResponseDto": {
        "properties": {
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "status": {
            "enum": [
              "ready"
            ],
            "type": "string"
          },
          "url": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "status",
          "url"
        ],
        "type": "object"
      },
      "PhotographyZipDto": {
        "additionalProperties": false,
        "properties": {
          "captureIds": {
            "default": [],
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 1000,
            "type": "array"
          },
          "outputs": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "captureId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "outputId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                }
              },
              "required": [
                "captureId",
                "outputId"
              ],
              "type": "object"
            },
            "maxItems": 1000,
            "minItems": 1,
            "type": "array"
          }
        },
        "type": "object"
      },
      "PhotographyCallbackDto": {
        "properties": {
          "received": {
            "type": "boolean"
          }
        },
        "required": [
          "received"
        ],
        "type": "object"
      },
      "PhotographyStudioPresetsDto": {
        "properties": {
          "presets": {
            "items": {
              "properties": {
                "config": {
                  "additionalProperties": false,
                  "properties": {
                    "additionalPrice": {
                      "maximum": 100000000,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "bundles": {
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "count": {
                            "maximum": 10000,
                            "minimum": 1,
                            "type": "integer"
                          },
                          "price": {
                            "maximum": 100000000,
                            "minimum": 0,
                            "type": "integer"
                          }
                        },
                        "required": [
                          "count",
                          "price"
                        ],
                        "type": "object"
                      },
                      "maxItems": 20,
                      "type": "array"
                    },
                    "collectionPrice": {
                      "maximum": 100000000,
                      "minimum": 0,
                      "nullable": true,
                      "type": "integer"
                    },
                    "currency": {
                      "pattern": "^[A-Z]{3}$",
                      "type": "string"
                    },
                    "downloadOutputs": {
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "key": {
                            "pattern": "^[a-z][a-z0-9-]{0,39}$",
                            "type": "string"
                          },
                          "kind": {
                            "enum": [
                              "print",
                              "web",
                              "social"
                            ],
                            "type": "string"
                          },
                          "label": {
                            "maxLength": 100,
                            "minLength": 1,
                            "type": "string"
                          },
                          "maxEdge": {
                            "maximum": 65535,
                            "minimum": 320,
                            "type": "integer"
                          },
                          "watermark": {
                            "additionalProperties": false,
                            "nullable": true,
                            "properties": {
                              "alignment": {
                                "default": "center",
                                "enum": [
                                  "left",
                                  "center",
                                  "right"
                                ],
                                "type": "string"
                              },
                              "backing": {
                                "default": false,
                                "type": "boolean"
                              },
                              "color": {
                                "default": "#ffffff",
                                "pattern": "^#[\\da-fA-F]{6}$",
                                "type": "string"
                              },
                              "font": {
                                "default": "script",
                                "enum": [
                                  "script",
                                  "serif",
                                  "sans"
                                ],
                                "type": "string"
                              },
                              "logoAssetId": {
                                "default": null,
                                "format": "uuid",
                                "nullable": true,
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                "type": "string"
                              },
                              "logoPosition": {
                                "default": "above",
                                "enum": [
                                  "above",
                                  "below",
                                  "left",
                                  "right"
                                ],
                                "type": "string"
                              },
                              "logoScale": {
                                "default": 1,
                                "maximum": 4,
                                "minimum": 0.25,
                                "type": "number"
                              },
                              "logoVariant": {
                                "default": "original",
                                "enum": [
                                  "original",
                                  "light",
                                  "dark"
                                ],
                                "type": "string"
                              },
                              "margin": {
                                "default": 4,
                                "maximum": 25,
                                "minimum": 0,
                                "type": "number"
                              },
                              "opacity": {
                                "default": 45,
                                "maximum": 100,
                                "minimum": 1,
                                "type": "number"
                              },
                              "outline": {
                                "default": false,
                                "type": "boolean"
                              },
                              "pattern": {
                                "default": "signature",
                                "enum": [
                                  "signature",
                                  "centre",
                                  "diagonal",
                                  "tile"
                                ],
                                "type": "string"
                              },
                              "position": {
                                "default": "bottom-right",
                                "enum": [
                                  "top-left",
                                  "top-right",
                                  "bottom-left",
                                  "bottom-right",
                                  "center"
                                ],
                                "type": "string"
                              },
                              "rotation": {
                                "default": 0,
                                "maximum": 180,
                                "minimum": -180,
                                "type": "number"
                              },
                              "secondLine": {
                                "default": "",
                                "maxLength": 200,
                                "type": "string"
                              },
                              "size": {
                                "default": 6,
                                "maximum": 30,
                                "minimum": 1,
                                "type": "number"
                              },
                              "spacing": {
                                "default": 6,
                                "maximum": 100,
                                "minimum": 0,
                                "type": "number"
                              },
                              "text": {
                                "maxLength": 200,
                                "minLength": 1,
                                "type": "string"
                              },
                              "type": {
                                "default": "text",
                                "enum": [
                                  "text",
                                  "logo",
                                  "both"
                                ],
                                "type": "string"
                              }
                            },
                            "required": [
                              "text"
                            ],
                            "type": "object"
                          }
                        },
                        "required": [
                          "key",
                          "label",
                          "kind",
                          "maxEdge",
                          "watermark"
                        ],
                        "type": "object"
                      },
                      "maxItems": 6,
                      "minItems": 1,
                      "type": "array"
                    },
                    "downloadWatermark": {
                      "additionalProperties": false,
                      "nullable": true,
                      "properties": {
                        "alignment": {
                          "default": "center",
                          "enum": [
                            "left",
                            "center",
                            "right"
                          ],
                          "type": "string"
                        },
                        "backing": {
                          "default": false,
                          "type": "boolean"
                        },
                        "color": {
                          "default": "#ffffff",
                          "pattern": "^#[\\da-fA-F]{6}$",
                          "type": "string"
                        },
                        "font": {
                          "default": "script",
                          "enum": [
                            "script",
                            "serif",
                            "sans"
                          ],
                          "type": "string"
                        },
                        "logoAssetId": {
                          "default": null,
                          "format": "uuid",
                          "nullable": true,
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                          "type": "string"
                        },
                        "logoPosition": {
                          "default": "above",
                          "enum": [
                            "above",
                            "below",
                            "left",
                            "right"
                          ],
                          "type": "string"
                        },
                        "logoScale": {
                          "default": 1,
                          "maximum": 4,
                          "minimum": 0.25,
                          "type": "number"
                        },
                        "logoVariant": {
                          "default": "original",
                          "enum": [
                            "original",
                            "light",
                            "dark"
                          ],
                          "type": "string"
                        },
                        "margin": {
                          "default": 4,
                          "maximum": 25,
                          "minimum": 0,
                          "type": "number"
                        },
                        "opacity": {
                          "default": 45,
                          "maximum": 100,
                          "minimum": 1,
                          "type": "number"
                        },
                        "outline": {
                          "default": false,
                          "type": "boolean"
                        },
                        "pattern": {
                          "default": "signature",
                          "enum": [
                            "signature",
                            "centre",
                            "diagonal",
                            "tile"
                          ],
                          "type": "string"
                        },
                        "position": {
                          "default": "bottom-right",
                          "enum": [
                            "top-left",
                            "top-right",
                            "bottom-left",
                            "bottom-right",
                            "center"
                          ],
                          "type": "string"
                        },
                        "rotation": {
                          "default": 0,
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        },
                        "secondLine": {
                          "default": "",
                          "maxLength": 200,
                          "type": "string"
                        },
                        "size": {
                          "default": 6,
                          "maximum": 30,
                          "minimum": 1,
                          "type": "number"
                        },
                        "spacing": {
                          "default": 6,
                          "maximum": 100,
                          "minimum": 0,
                          "type": "number"
                        },
                        "text": {
                          "maxLength": 200,
                          "minLength": 1,
                          "type": "string"
                        },
                        "type": {
                          "default": "text",
                          "enum": [
                            "text",
                            "logo",
                            "both"
                          ],
                          "type": "string"
                        }
                      },
                      "required": [
                        "text"
                      ],
                      "type": "object"
                    },
                    "expiresAt": {
                      "format": "date-time",
                      "nullable": true,
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                      "type": "string"
                    },
                    "includedCount": {
                      "maximum": 10000,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "mode": {
                      "enum": [
                        "edited-delivery",
                        "select-before-editing",
                        "sell-by-photo"
                      ],
                      "type": "string"
                    },
                    "paymentTiming": {
                      "enum": [
                        "before-editing",
                        "after-approval"
                      ],
                      "type": "string"
                    },
                    "presentation": {
                      "additionalProperties": false,
                      "properties": {
                        "blocks": {
                          "items": {
                            "additionalProperties": false,
                            "properties": {
                              "captureIds": {
                                "items": {
                                  "format": "uuid",
                                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                  "type": "string"
                                },
                                "maxItems": 1000,
                                "type": "array"
                              },
                              "chapterId": {
                                "format": "uuid",
                                "nullable": true,
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                "type": "string"
                              },
                              "id": {
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                "type": "string"
                              },
                              "selection": {
                                "enum": [
                                  "automatic",
                                  "explicit"
                                ],
                                "type": "string"
                              },
                              "text": {
                                "maxLength": 2000,
                                "type": "string"
                              },
                              "type": {
                                "enum": [
                                  "chapter",
                                  "grid",
                                  "full",
                                  "pair",
                                  "caption",
                                  "slideshow"
                                ],
                                "type": "string"
                              }
                            },
                            "required": [
                              "id",
                              "type",
                              "chapterId",
                              "captureIds",
                              "text"
                            ],
                            "type": "object"
                          },
                          "maxItems": 100,
                          "type": "array"
                        },
                        "coverCaptureId": {
                          "format": "uuid",
                          "nullable": true,
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                          "type": "string"
                        },
                        "coverFocal": {
                          "maximum": 100,
                          "minimum": 0,
                          "type": "number"
                        },
                        "coverTreatment": {
                          "enum": [
                            "full",
                            "split",
                            "quiet"
                          ],
                          "type": "string"
                        },
                        "font": {
                          "enum": [
                            "editorial",
                            "modern",
                            "script"
                          ],
                          "type": "string"
                        },
                        "introduction": {
                          "maxLength": 5000,
                          "type": "string"
                        },
                        "palette": {
                          "enum": [
                            "studio",
                            "ivory",
                            "charcoal"
                          ],
                          "type": "string"
                        },
                        "showChapters": {
                          "type": "boolean"
                        },
                        "showNumbers": {
                          "type": "boolean"
                        },
                        "spacing": {
                          "enum": [
                            "compact",
                            "comfortable",
                            "airy"
                          ],
                          "type": "string"
                        },
                        "template": {
                          "enum": [
                            "wedding",
                            "portrait",
                            "fine-art",
                            "proofing"
                          ],
                          "type": "string"
                        }
                      },
                      "required": [
                        "template",
                        "coverCaptureId",
                        "coverTreatment",
                        "coverFocal",
                        "font",
                        "palette",
                        "spacing",
                        "introduction",
                        "showChapters",
                        "showNumbers"
                      ],
                      "type": "object"
                    },
                    "proofWatermark": {
                      "additionalProperties": false,
                      "properties": {
                        "alignment": {
                          "default": "center",
                          "enum": [
                            "left",
                            "center",
                            "right"
                          ],
                          "type": "string"
                        },
                        "backing": {
                          "default": false,
                          "type": "boolean"
                        },
                        "color": {
                          "default": "#ffffff",
                          "pattern": "^#[\\da-fA-F]{6}$",
                          "type": "string"
                        },
                        "font": {
                          "default": "script",
                          "enum": [
                            "script",
                            "serif",
                            "sans"
                          ],
                          "type": "string"
                        },
                        "logoAssetId": {
                          "default": null,
                          "format": "uuid",
                          "nullable": true,
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                          "type": "string"
                        },
                        "logoPosition": {
                          "default": "above",
                          "enum": [
                            "above",
                            "below",
                            "left",
                            "right"
                          ],
                          "type": "string"
                        },
                        "logoScale": {
                          "default": 1,
                          "maximum": 4,
                          "minimum": 0.25,
                          "type": "number"
                        },
                        "logoVariant": {
                          "default": "original",
                          "enum": [
                            "original",
                            "light",
                            "dark"
                          ],
                          "type": "string"
                        },
                        "margin": {
                          "default": 4,
                          "maximum": 25,
                          "minimum": 0,
                          "type": "number"
                        },
                        "opacity": {
                          "default": 45,
                          "maximum": 100,
                          "minimum": 1,
                          "type": "number"
                        },
                        "outline": {
                          "default": false,
                          "type": "boolean"
                        },
                        "pattern": {
                          "default": "signature",
                          "enum": [
                            "signature",
                            "centre",
                            "diagonal",
                            "tile"
                          ],
                          "type": "string"
                        },
                        "position": {
                          "default": "bottom-right",
                          "enum": [
                            "top-left",
                            "top-right",
                            "bottom-left",
                            "bottom-right",
                            "center"
                          ],
                          "type": "string"
                        },
                        "rotation": {
                          "default": 0,
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        },
                        "secondLine": {
                          "default": "",
                          "maxLength": 200,
                          "type": "string"
                        },
                        "size": {
                          "default": 6,
                          "maximum": 30,
                          "minimum": 1,
                          "type": "number"
                        },
                        "spacing": {
                          "default": 6,
                          "maximum": 100,
                          "minimum": 0,
                          "type": "number"
                        },
                        "text": {
                          "maxLength": 200,
                          "minLength": 1,
                          "type": "string"
                        },
                        "type": {
                          "default": "text",
                          "enum": [
                            "text",
                            "logo",
                            "both"
                          ],
                          "type": "string"
                        }
                      },
                      "required": [
                        "text"
                      ],
                      "type": "object"
                    },
                    "selectionDeadline": {
                      "format": "date-time",
                      "nullable": true,
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                      "type": "string"
                    },
                    "terms": {
                      "maxLength": 5000,
                      "type": "string"
                    },
                    "title": {
                      "maxLength": 200,
                      "minLength": 1,
                      "type": "string"
                    },
                    "turnaroundDays": {
                      "maximum": 365,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "webWatermark": {
                      "additionalProperties": false,
                      "nullable": true,
                      "properties": {
                        "alignment": {
                          "default": "center",
                          "enum": [
                            "left",
                            "center",
                            "right"
                          ],
                          "type": "string"
                        },
                        "backing": {
                          "default": false,
                          "type": "boolean"
                        },
                        "color": {
                          "default": "#ffffff",
                          "pattern": "^#[\\da-fA-F]{6}$",
                          "type": "string"
                        },
                        "font": {
                          "default": "script",
                          "enum": [
                            "script",
                            "serif",
                            "sans"
                          ],
                          "type": "string"
                        },
                        "logoAssetId": {
                          "default": null,
                          "format": "uuid",
                          "nullable": true,
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                          "type": "string"
                        },
                        "logoPosition": {
                          "default": "above",
                          "enum": [
                            "above",
                            "below",
                            "left",
                            "right"
                          ],
                          "type": "string"
                        },
                        "logoScale": {
                          "default": 1,
                          "maximum": 4,
                          "minimum": 0.25,
                          "type": "number"
                        },
                        "logoVariant": {
                          "default": "original",
                          "enum": [
                            "original",
                            "light",
                            "dark"
                          ],
                          "type": "string"
                        },
                        "margin": {
                          "default": 4,
                          "maximum": 25,
                          "minimum": 0,
                          "type": "number"
                        },
                        "opacity": {
                          "default": 45,
                          "maximum": 100,
                          "minimum": 1,
                          "type": "number"
                        },
                        "outline": {
                          "default": false,
                          "type": "boolean"
                        },
                        "pattern": {
                          "default": "signature",
                          "enum": [
                            "signature",
                            "centre",
                            "diagonal",
                            "tile"
                          ],
                          "type": "string"
                        },
                        "position": {
                          "default": "bottom-right",
                          "enum": [
                            "top-left",
                            "top-right",
                            "bottom-left",
                            "bottom-right",
                            "center"
                          ],
                          "type": "string"
                        },
                        "rotation": {
                          "default": 0,
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        },
                        "secondLine": {
                          "default": "",
                          "maxLength": 200,
                          "type": "string"
                        },
                        "size": {
                          "default": 6,
                          "maximum": 30,
                          "minimum": 1,
                          "type": "number"
                        },
                        "spacing": {
                          "default": 6,
                          "maximum": 100,
                          "minimum": 0,
                          "type": "number"
                        },
                        "text": {
                          "maxLength": 200,
                          "minLength": 1,
                          "type": "string"
                        },
                        "type": {
                          "default": "text",
                          "enum": [
                            "text",
                            "logo",
                            "both"
                          ],
                          "type": "string"
                        }
                      },
                      "required": [
                        "text"
                      ],
                      "type": "object"
                    }
                  },
                  "required": [
                    "presentation",
                    "title",
                    "mode",
                    "paymentTiming",
                    "currency",
                    "includedCount",
                    "additionalPrice",
                    "collectionPrice",
                    "bundles",
                    "terms",
                    "selectionDeadline",
                    "expiresAt",
                    "turnaroundDays",
                    "proofWatermark",
                    "webWatermark",
                    "downloadWatermark"
                  ],
                  "type": "object"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "name": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "name",
                "config"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "revision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          }
        },
        "required": [
          "presets",
          "revision"
        ],
        "type": "object"
      },
      "PhotographyPresetSaveDto": {
        "additionalProperties": false,
        "properties": {
          "config": {
            "additionalProperties": false,
            "properties": {
              "additionalPrice": {
                "maximum": 100000000,
                "minimum": 0,
                "type": "integer"
              },
              "bundles": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "count": {
                      "maximum": 10000,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "price": {
                      "maximum": 100000000,
                      "minimum": 0,
                      "type": "integer"
                    }
                  },
                  "required": [
                    "count",
                    "price"
                  ],
                  "type": "object"
                },
                "maxItems": 20,
                "type": "array"
              },
              "collectionPrice": {
                "maximum": 100000000,
                "minimum": 0,
                "nullable": true,
                "type": "integer"
              },
              "currency": {
                "pattern": "^[A-Z]{3}$",
                "type": "string"
              },
              "downloadOutputs": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "key": {
                      "pattern": "^[a-z][a-z0-9-]{0,39}$",
                      "type": "string"
                    },
                    "kind": {
                      "enum": [
                        "print",
                        "web",
                        "social"
                      ],
                      "type": "string"
                    },
                    "label": {
                      "maxLength": 100,
                      "minLength": 1,
                      "type": "string"
                    },
                    "maxEdge": {
                      "maximum": 65535,
                      "minimum": 320,
                      "type": "integer"
                    },
                    "watermark": {
                      "additionalProperties": false,
                      "nullable": true,
                      "properties": {
                        "alignment": {
                          "default": "center",
                          "enum": [
                            "left",
                            "center",
                            "right"
                          ],
                          "type": "string"
                        },
                        "backing": {
                          "default": false,
                          "type": "boolean"
                        },
                        "color": {
                          "default": "#ffffff",
                          "pattern": "^#[\\da-fA-F]{6}$",
                          "type": "string"
                        },
                        "font": {
                          "default": "script",
                          "enum": [
                            "script",
                            "serif",
                            "sans"
                          ],
                          "type": "string"
                        },
                        "logoAssetId": {
                          "default": null,
                          "format": "uuid",
                          "nullable": true,
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                          "type": "string"
                        },
                        "logoPosition": {
                          "default": "above",
                          "enum": [
                            "above",
                            "below",
                            "left",
                            "right"
                          ],
                          "type": "string"
                        },
                        "logoScale": {
                          "default": 1,
                          "maximum": 4,
                          "minimum": 0.25,
                          "type": "number"
                        },
                        "logoVariant": {
                          "default": "original",
                          "enum": [
                            "original",
                            "light",
                            "dark"
                          ],
                          "type": "string"
                        },
                        "margin": {
                          "default": 4,
                          "maximum": 25,
                          "minimum": 0,
                          "type": "number"
                        },
                        "opacity": {
                          "default": 45,
                          "maximum": 100,
                          "minimum": 1,
                          "type": "number"
                        },
                        "outline": {
                          "default": false,
                          "type": "boolean"
                        },
                        "pattern": {
                          "default": "signature",
                          "enum": [
                            "signature",
                            "centre",
                            "diagonal",
                            "tile"
                          ],
                          "type": "string"
                        },
                        "position": {
                          "default": "bottom-right",
                          "enum": [
                            "top-left",
                            "top-right",
                            "bottom-left",
                            "bottom-right",
                            "center"
                          ],
                          "type": "string"
                        },
                        "rotation": {
                          "default": 0,
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        },
                        "secondLine": {
                          "default": "",
                          "maxLength": 200,
                          "type": "string"
                        },
                        "size": {
                          "default": 6,
                          "maximum": 30,
                          "minimum": 1,
                          "type": "number"
                        },
                        "spacing": {
                          "default": 6,
                          "maximum": 100,
                          "minimum": 0,
                          "type": "number"
                        },
                        "text": {
                          "maxLength": 200,
                          "minLength": 1,
                          "type": "string"
                        },
                        "type": {
                          "default": "text",
                          "enum": [
                            "text",
                            "logo",
                            "both"
                          ],
                          "type": "string"
                        }
                      },
                      "required": [
                        "text"
                      ],
                      "type": "object"
                    }
                  },
                  "required": [
                    "key",
                    "label",
                    "kind",
                    "maxEdge",
                    "watermark"
                  ],
                  "type": "object"
                },
                "maxItems": 6,
                "minItems": 1,
                "type": "array"
              },
              "downloadWatermark": {
                "additionalProperties": false,
                "nullable": true,
                "properties": {
                  "alignment": {
                    "default": "center",
                    "enum": [
                      "left",
                      "center",
                      "right"
                    ],
                    "type": "string"
                  },
                  "backing": {
                    "default": false,
                    "type": "boolean"
                  },
                  "color": {
                    "default": "#ffffff",
                    "pattern": "^#[\\da-fA-F]{6}$",
                    "type": "string"
                  },
                  "font": {
                    "default": "script",
                    "enum": [
                      "script",
                      "serif",
                      "sans"
                    ],
                    "type": "string"
                  },
                  "logoAssetId": {
                    "default": null,
                    "format": "uuid",
                    "nullable": true,
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                    "type": "string"
                  },
                  "logoPosition": {
                    "default": "above",
                    "enum": [
                      "above",
                      "below",
                      "left",
                      "right"
                    ],
                    "type": "string"
                  },
                  "logoScale": {
                    "default": 1,
                    "maximum": 4,
                    "minimum": 0.25,
                    "type": "number"
                  },
                  "logoVariant": {
                    "default": "original",
                    "enum": [
                      "original",
                      "light",
                      "dark"
                    ],
                    "type": "string"
                  },
                  "margin": {
                    "default": 4,
                    "maximum": 25,
                    "minimum": 0,
                    "type": "number"
                  },
                  "opacity": {
                    "default": 45,
                    "maximum": 100,
                    "minimum": 1,
                    "type": "number"
                  },
                  "outline": {
                    "default": false,
                    "type": "boolean"
                  },
                  "pattern": {
                    "default": "signature",
                    "enum": [
                      "signature",
                      "centre",
                      "diagonal",
                      "tile"
                    ],
                    "type": "string"
                  },
                  "position": {
                    "default": "bottom-right",
                    "enum": [
                      "top-left",
                      "top-right",
                      "bottom-left",
                      "bottom-right",
                      "center"
                    ],
                    "type": "string"
                  },
                  "rotation": {
                    "default": 0,
                    "maximum": 180,
                    "minimum": -180,
                    "type": "number"
                  },
                  "secondLine": {
                    "default": "",
                    "maxLength": 200,
                    "type": "string"
                  },
                  "size": {
                    "default": 6,
                    "maximum": 30,
                    "minimum": 1,
                    "type": "number"
                  },
                  "spacing": {
                    "default": 6,
                    "maximum": 100,
                    "minimum": 0,
                    "type": "number"
                  },
                  "text": {
                    "maxLength": 200,
                    "minLength": 1,
                    "type": "string"
                  },
                  "type": {
                    "default": "text",
                    "enum": [
                      "text",
                      "logo",
                      "both"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "text"
                ],
                "type": "object"
              },
              "expiresAt": {
                "format": "date-time",
                "nullable": true,
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                "type": "string"
              },
              "includedCount": {
                "maximum": 10000,
                "minimum": 0,
                "type": "integer"
              },
              "mode": {
                "enum": [
                  "edited-delivery",
                  "select-before-editing",
                  "sell-by-photo"
                ],
                "type": "string"
              },
              "paymentTiming": {
                "enum": [
                  "before-editing",
                  "after-approval"
                ],
                "type": "string"
              },
              "presentation": {
                "additionalProperties": false,
                "properties": {
                  "blocks": {
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "captureIds": {
                          "items": {
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                            "type": "string"
                          },
                          "maxItems": 1000,
                          "type": "array"
                        },
                        "chapterId": {
                          "format": "uuid",
                          "nullable": true,
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                          "type": "string"
                        },
                        "id": {
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                          "type": "string"
                        },
                        "selection": {
                          "enum": [
                            "automatic",
                            "explicit"
                          ],
                          "type": "string"
                        },
                        "text": {
                          "maxLength": 2000,
                          "type": "string"
                        },
                        "type": {
                          "enum": [
                            "chapter",
                            "grid",
                            "full",
                            "pair",
                            "caption",
                            "slideshow"
                          ],
                          "type": "string"
                        }
                      },
                      "required": [
                        "id",
                        "type",
                        "chapterId",
                        "captureIds",
                        "text"
                      ],
                      "type": "object"
                    },
                    "maxItems": 100,
                    "type": "array"
                  },
                  "coverCaptureId": {
                    "format": "uuid",
                    "nullable": true,
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                    "type": "string"
                  },
                  "coverFocal": {
                    "maximum": 100,
                    "minimum": 0,
                    "type": "number"
                  },
                  "coverTreatment": {
                    "enum": [
                      "full",
                      "split",
                      "quiet"
                    ],
                    "type": "string"
                  },
                  "font": {
                    "enum": [
                      "editorial",
                      "modern",
                      "script"
                    ],
                    "type": "string"
                  },
                  "introduction": {
                    "maxLength": 5000,
                    "type": "string"
                  },
                  "palette": {
                    "enum": [
                      "studio",
                      "ivory",
                      "charcoal"
                    ],
                    "type": "string"
                  },
                  "showChapters": {
                    "type": "boolean"
                  },
                  "showNumbers": {
                    "type": "boolean"
                  },
                  "spacing": {
                    "enum": [
                      "compact",
                      "comfortable",
                      "airy"
                    ],
                    "type": "string"
                  },
                  "template": {
                    "enum": [
                      "wedding",
                      "portrait",
                      "fine-art",
                      "proofing"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "template",
                  "coverCaptureId",
                  "coverTreatment",
                  "coverFocal",
                  "font",
                  "palette",
                  "spacing",
                  "introduction",
                  "showChapters",
                  "showNumbers"
                ],
                "type": "object"
              },
              "proofWatermark": {
                "additionalProperties": false,
                "properties": {
                  "alignment": {
                    "default": "center",
                    "enum": [
                      "left",
                      "center",
                      "right"
                    ],
                    "type": "string"
                  },
                  "backing": {
                    "default": false,
                    "type": "boolean"
                  },
                  "color": {
                    "default": "#ffffff",
                    "pattern": "^#[\\da-fA-F]{6}$",
                    "type": "string"
                  },
                  "font": {
                    "default": "script",
                    "enum": [
                      "script",
                      "serif",
                      "sans"
                    ],
                    "type": "string"
                  },
                  "logoAssetId": {
                    "default": null,
                    "format": "uuid",
                    "nullable": true,
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                    "type": "string"
                  },
                  "logoPosition": {
                    "default": "above",
                    "enum": [
                      "above",
                      "below",
                      "left",
                      "right"
                    ],
                    "type": "string"
                  },
                  "logoScale": {
                    "default": 1,
                    "maximum": 4,
                    "minimum": 0.25,
                    "type": "number"
                  },
                  "logoVariant": {
                    "default": "original",
                    "enum": [
                      "original",
                      "light",
                      "dark"
                    ],
                    "type": "string"
                  },
                  "margin": {
                    "default": 4,
                    "maximum": 25,
                    "minimum": 0,
                    "type": "number"
                  },
                  "opacity": {
                    "default": 45,
                    "maximum": 100,
                    "minimum": 1,
                    "type": "number"
                  },
                  "outline": {
                    "default": false,
                    "type": "boolean"
                  },
                  "pattern": {
                    "default": "signature",
                    "enum": [
                      "signature",
                      "centre",
                      "diagonal",
                      "tile"
                    ],
                    "type": "string"
                  },
                  "position": {
                    "default": "bottom-right",
                    "enum": [
                      "top-left",
                      "top-right",
                      "bottom-left",
                      "bottom-right",
                      "center"
                    ],
                    "type": "string"
                  },
                  "rotation": {
                    "default": 0,
                    "maximum": 180,
                    "minimum": -180,
                    "type": "number"
                  },
                  "secondLine": {
                    "default": "",
                    "maxLength": 200,
                    "type": "string"
                  },
                  "size": {
                    "default": 6,
                    "maximum": 30,
                    "minimum": 1,
                    "type": "number"
                  },
                  "spacing": {
                    "default": 6,
                    "maximum": 100,
                    "minimum": 0,
                    "type": "number"
                  },
                  "text": {
                    "maxLength": 200,
                    "minLength": 1,
                    "type": "string"
                  },
                  "type": {
                    "default": "text",
                    "enum": [
                      "text",
                      "logo",
                      "both"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "text"
                ],
                "type": "object"
              },
              "selectionDeadline": {
                "format": "date-time",
                "nullable": true,
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                "type": "string"
              },
              "terms": {
                "maxLength": 5000,
                "type": "string"
              },
              "title": {
                "maxLength": 200,
                "minLength": 1,
                "type": "string"
              },
              "turnaroundDays": {
                "maximum": 365,
                "minimum": 0,
                "type": "integer"
              },
              "webWatermark": {
                "additionalProperties": false,
                "nullable": true,
                "properties": {
                  "alignment": {
                    "default": "center",
                    "enum": [
                      "left",
                      "center",
                      "right"
                    ],
                    "type": "string"
                  },
                  "backing": {
                    "default": false,
                    "type": "boolean"
                  },
                  "color": {
                    "default": "#ffffff",
                    "pattern": "^#[\\da-fA-F]{6}$",
                    "type": "string"
                  },
                  "font": {
                    "default": "script",
                    "enum": [
                      "script",
                      "serif",
                      "sans"
                    ],
                    "type": "string"
                  },
                  "logoAssetId": {
                    "default": null,
                    "format": "uuid",
                    "nullable": true,
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                    "type": "string"
                  },
                  "logoPosition": {
                    "default": "above",
                    "enum": [
                      "above",
                      "below",
                      "left",
                      "right"
                    ],
                    "type": "string"
                  },
                  "logoScale": {
                    "default": 1,
                    "maximum": 4,
                    "minimum": 0.25,
                    "type": "number"
                  },
                  "logoVariant": {
                    "default": "original",
                    "enum": [
                      "original",
                      "light",
                      "dark"
                    ],
                    "type": "string"
                  },
                  "margin": {
                    "default": 4,
                    "maximum": 25,
                    "minimum": 0,
                    "type": "number"
                  },
                  "opacity": {
                    "default": 45,
                    "maximum": 100,
                    "minimum": 1,
                    "type": "number"
                  },
                  "outline": {
                    "default": false,
                    "type": "boolean"
                  },
                  "pattern": {
                    "default": "signature",
                    "enum": [
                      "signature",
                      "centre",
                      "diagonal",
                      "tile"
                    ],
                    "type": "string"
                  },
                  "position": {
                    "default": "bottom-right",
                    "enum": [
                      "top-left",
                      "top-right",
                      "bottom-left",
                      "bottom-right",
                      "center"
                    ],
                    "type": "string"
                  },
                  "rotation": {
                    "default": 0,
                    "maximum": 180,
                    "minimum": -180,
                    "type": "number"
                  },
                  "secondLine": {
                    "default": "",
                    "maxLength": 200,
                    "type": "string"
                  },
                  "size": {
                    "default": 6,
                    "maximum": 30,
                    "minimum": 1,
                    "type": "number"
                  },
                  "spacing": {
                    "default": 6,
                    "maximum": 100,
                    "minimum": 0,
                    "type": "number"
                  },
                  "text": {
                    "maxLength": 200,
                    "minLength": 1,
                    "type": "string"
                  },
                  "type": {
                    "default": "text",
                    "enum": [
                      "text",
                      "logo",
                      "both"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "text"
                ],
                "type": "object"
              }
            },
            "required": [
              "presentation",
              "title",
              "mode",
              "paymentTiming",
              "currency",
              "includedCount",
              "additionalPrice",
              "collectionPrice",
              "bundles",
              "terms",
              "selectionDeadline",
              "expiresAt",
              "turnaroundDays",
              "proofWatermark",
              "webWatermark",
              "downloadWatermark"
            ],
            "type": "object"
          },
          "expectedRevision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "config",
          "expectedRevision",
          "id",
          "name"
        ],
        "type": "object"
      },
      "PhotographyWorkspaceDto": {
        "properties": {
          "revision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "shoots": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "albumId": {
                  "description": "Owned source album; null retains an unavailable existing shoot",
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "assetCount": {
                  "maximum": 9007199254740991,
                  "minimum": 0,
                  "nullable": true,
                  "type": "integer"
                },
                "client": {
                  "maxLength": 200,
                  "minLength": 1,
                  "type": "string"
                },
                "coverAssetId": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "date": {
                  "format": "date",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "name": {
                  "maxLength": 200,
                  "minLength": 1,
                  "type": "string"
                },
                "stage": {
                  "enum": [
                    "Imported",
                    "Selected",
                    "Edited",
                    "Proofing",
                    "Delivered"
                  ],
                  "type": "string"
                },
                "type": {
                  "enum": [
                    "Family portrait",
                    "Wedding",
                    "Portrait",
                    "Editorial",
                    "Commercial",
                    "Event",
                    "Personal"
                  ],
                  "type": "string"
                },
                "unavailable": {
                  "type": "boolean"
                }
              },
              "required": [
                "id",
                "albumId",
                "name",
                "client",
                "type",
                "date",
                "stage",
                "unavailable",
                "coverAssetId",
                "assetCount"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "revision",
          "shoots"
        ],
        "type": "object"
      },
      "PhotographyWorkspaceSaveDto": {
        "additionalProperties": false,
        "properties": {
          "expectedRevision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "shoots": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "albumId": {
                  "description": "Owned source album; null retains an unavailable existing shoot",
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "client": {
                  "maxLength": 200,
                  "minLength": 1,
                  "type": "string"
                },
                "date": {
                  "format": "date",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "name": {
                  "maxLength": 200,
                  "minLength": 1,
                  "type": "string"
                },
                "stage": {
                  "enum": [
                    "Imported",
                    "Selected",
                    "Edited",
                    "Proofing",
                    "Delivered"
                  ],
                  "type": "string"
                },
                "type": {
                  "enum": [
                    "Family portrait",
                    "Wedding",
                    "Portrait",
                    "Editorial",
                    "Commercial",
                    "Event",
                    "Personal"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "id",
                "albumId",
                "name",
                "client",
                "type",
                "date",
                "stage"
              ],
              "type": "object"
            },
            "maxItems": 200,
            "type": "array"
          }
        },
        "required": [
          "expectedRevision",
          "shoots"
        ],
        "type": "object"
      },
      "PhotographyBrandDto": {
        "properties": {
          "brand": {
            "additionalProperties": false,
            "properties": {
              "background": {
                "pattern": "^#[\\da-fA-F]{6}$",
                "type": "string"
              },
              "color": {
                "pattern": "^#[\\da-fA-F]{6}$",
                "type": "string"
              },
              "email": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 254,
                    "format": "email",
                    "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
                  },
                  {
                    "type": "string",
                    "enum": [
                      ""
                    ]
                  }
                ]
              },
              "exportWatermarkPresetId": {
                "default": null,
                "format": "uuid",
                "nullable": true,
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "font": {
                "enum": [
                  "editorial",
                  "modern",
                  "classic"
                ],
                "type": "string"
              },
              "logoAssetId": {
                "format": "uuid",
                "nullable": true,
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "logoInitials": {
                "maxLength": 12,
                "type": "string"
              },
              "name": {
                "maxLength": 200,
                "minLength": 1,
                "type": "string"
              },
              "phone": {
                "maxLength": 100,
                "type": "string"
              },
              "proofWatermarkPresetId": {
                "default": null,
                "format": "uuid",
                "nullable": true,
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "tagline": {
                "maxLength": 300,
                "type": "string"
              },
              "textColor": {
                "pattern": "^#[\\da-fA-F]{6}$",
                "type": "string"
              },
              "watermarkColor": {
                "pattern": "^#[\\da-fA-F]{6}$",
                "type": "string"
              },
              "watermarkOpacity": {
                "maximum": 100,
                "minimum": 10,
                "type": "integer"
              },
              "watermarkPosition": {
                "enum": [
                  "bottom-right",
                  "bottom-left",
                  "center",
                  "top-right"
                ],
                "type": "string"
              },
              "watermarkPresets": {
                "default": [],
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "id": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "name": {
                      "maxLength": 100,
                      "minLength": 1,
                      "type": "string"
                    },
                    "version": {
                      "exclusiveMinimum": true,
                      "maximum": 9007199254740991,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "watermark": {
                      "additionalProperties": false,
                      "properties": {
                        "alignment": {
                          "default": "center",
                          "enum": [
                            "left",
                            "center",
                            "right"
                          ],
                          "type": "string"
                        },
                        "backing": {
                          "default": false,
                          "type": "boolean"
                        },
                        "color": {
                          "default": "#ffffff",
                          "pattern": "^#[\\da-fA-F]{6}$",
                          "type": "string"
                        },
                        "font": {
                          "default": "script",
                          "enum": [
                            "script",
                            "serif",
                            "sans"
                          ],
                          "type": "string"
                        },
                        "logoAssetId": {
                          "default": null,
                          "format": "uuid",
                          "nullable": true,
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                          "type": "string"
                        },
                        "logoPosition": {
                          "default": "above",
                          "enum": [
                            "above",
                            "below",
                            "left",
                            "right"
                          ],
                          "type": "string"
                        },
                        "logoScale": {
                          "default": 1,
                          "maximum": 4,
                          "minimum": 0.25,
                          "type": "number"
                        },
                        "logoVariant": {
                          "default": "original",
                          "enum": [
                            "original",
                            "light",
                            "dark"
                          ],
                          "type": "string"
                        },
                        "margin": {
                          "default": 4,
                          "maximum": 25,
                          "minimum": 0,
                          "type": "number"
                        },
                        "opacity": {
                          "default": 45,
                          "maximum": 100,
                          "minimum": 1,
                          "type": "number"
                        },
                        "outline": {
                          "default": false,
                          "type": "boolean"
                        },
                        "pattern": {
                          "default": "signature",
                          "enum": [
                            "signature",
                            "centre",
                            "diagonal",
                            "tile"
                          ],
                          "type": "string"
                        },
                        "position": {
                          "default": "bottom-right",
                          "enum": [
                            "top-left",
                            "top-right",
                            "bottom-left",
                            "bottom-right",
                            "center"
                          ],
                          "type": "string"
                        },
                        "rotation": {
                          "default": 0,
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        },
                        "secondLine": {
                          "default": "",
                          "maxLength": 200,
                          "type": "string"
                        },
                        "size": {
                          "default": 6,
                          "maximum": 30,
                          "minimum": 1,
                          "type": "number"
                        },
                        "spacing": {
                          "default": 6,
                          "maximum": 100,
                          "minimum": 0,
                          "type": "number"
                        },
                        "text": {
                          "maxLength": 200,
                          "minLength": 1,
                          "type": "string"
                        },
                        "type": {
                          "default": "text",
                          "enum": [
                            "text",
                            "logo",
                            "both"
                          ],
                          "type": "string"
                        }
                      },
                      "required": [
                        "text"
                      ],
                      "type": "object"
                    }
                  },
                  "required": [
                    "id",
                    "name",
                    "version",
                    "watermark"
                  ],
                  "type": "object"
                },
                "maxItems": 30,
                "type": "array"
              },
              "watermarkSize": {
                "maximum": 12,
                "minimum": 3,
                "type": "integer"
              },
              "webWatermarkPresetId": {
                "default": null,
                "format": "uuid",
                "nullable": true,
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              }
            },
            "required": [
              "name",
              "tagline",
              "email",
              "phone",
              "logoInitials",
              "logoAssetId",
              "color",
              "background",
              "textColor",
              "font",
              "watermarkColor",
              "watermarkOpacity",
              "watermarkPosition",
              "watermarkSize"
            ],
            "type": "object"
          },
          "logoUnavailable": {
            "description": "Stored logo is no longer eligible; its identity is redacted",
            "type": "boolean"
          },
          "revision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          }
        },
        "required": [
          "brand",
          "logoUnavailable",
          "revision"
        ],
        "type": "object"
      },
      "PhotographyBrandSaveDto": {
        "additionalProperties": false,
        "properties": {
          "brand": {
            "additionalProperties": false,
            "properties": {
              "background": {
                "pattern": "^#[\\da-fA-F]{6}$",
                "type": "string"
              },
              "color": {
                "pattern": "^#[\\da-fA-F]{6}$",
                "type": "string"
              },
              "email": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 254,
                    "format": "email",
                    "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
                  },
                  {
                    "type": "string",
                    "enum": [
                      ""
                    ]
                  }
                ]
              },
              "exportWatermarkPresetId": {
                "format": "uuid",
                "nullable": true,
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "font": {
                "enum": [
                  "editorial",
                  "modern",
                  "classic"
                ],
                "type": "string"
              },
              "logoAssetId": {
                "description": "Omit to retain the existing logo reference; null explicitly selects initials",
                "format": "uuid",
                "nullable": true,
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "logoInitials": {
                "maxLength": 12,
                "type": "string"
              },
              "name": {
                "maxLength": 200,
                "minLength": 1,
                "type": "string"
              },
              "phone": {
                "maxLength": 100,
                "type": "string"
              },
              "proofWatermarkPresetId": {
                "format": "uuid",
                "nullable": true,
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "tagline": {
                "maxLength": 300,
                "type": "string"
              },
              "textColor": {
                "pattern": "^#[\\da-fA-F]{6}$",
                "type": "string"
              },
              "watermarkColor": {
                "pattern": "^#[\\da-fA-F]{6}$",
                "type": "string"
              },
              "watermarkOpacity": {
                "maximum": 100,
                "minimum": 10,
                "type": "integer"
              },
              "watermarkPosition": {
                "enum": [
                  "bottom-right",
                  "bottom-left",
                  "center",
                  "top-right"
                ],
                "type": "string"
              },
              "watermarkPresets": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "id": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "name": {
                      "maxLength": 100,
                      "minLength": 1,
                      "type": "string"
                    },
                    "version": {
                      "exclusiveMinimum": true,
                      "maximum": 9007199254740991,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "watermark": {
                      "additionalProperties": false,
                      "properties": {
                        "alignment": {
                          "default": "center",
                          "enum": [
                            "left",
                            "center",
                            "right"
                          ],
                          "type": "string"
                        },
                        "backing": {
                          "default": false,
                          "type": "boolean"
                        },
                        "color": {
                          "default": "#ffffff",
                          "pattern": "^#[\\da-fA-F]{6}$",
                          "type": "string"
                        },
                        "font": {
                          "default": "script",
                          "enum": [
                            "script",
                            "serif",
                            "sans"
                          ],
                          "type": "string"
                        },
                        "logoAssetId": {
                          "default": null,
                          "format": "uuid",
                          "nullable": true,
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                          "type": "string"
                        },
                        "logoPosition": {
                          "default": "above",
                          "enum": [
                            "above",
                            "below",
                            "left",
                            "right"
                          ],
                          "type": "string"
                        },
                        "logoScale": {
                          "default": 1,
                          "maximum": 4,
                          "minimum": 0.25,
                          "type": "number"
                        },
                        "logoVariant": {
                          "default": "original",
                          "enum": [
                            "original",
                            "light",
                            "dark"
                          ],
                          "type": "string"
                        },
                        "margin": {
                          "default": 4,
                          "maximum": 25,
                          "minimum": 0,
                          "type": "number"
                        },
                        "opacity": {
                          "default": 45,
                          "maximum": 100,
                          "minimum": 1,
                          "type": "number"
                        },
                        "outline": {
                          "default": false,
                          "type": "boolean"
                        },
                        "pattern": {
                          "default": "signature",
                          "enum": [
                            "signature",
                            "centre",
                            "diagonal",
                            "tile"
                          ],
                          "type": "string"
                        },
                        "position": {
                          "default": "bottom-right",
                          "enum": [
                            "top-left",
                            "top-right",
                            "bottom-left",
                            "bottom-right",
                            "center"
                          ],
                          "type": "string"
                        },
                        "rotation": {
                          "default": 0,
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        },
                        "secondLine": {
                          "default": "",
                          "maxLength": 200,
                          "type": "string"
                        },
                        "size": {
                          "default": 6,
                          "maximum": 30,
                          "minimum": 1,
                          "type": "number"
                        },
                        "spacing": {
                          "default": 6,
                          "maximum": 100,
                          "minimum": 0,
                          "type": "number"
                        },
                        "text": {
                          "maxLength": 200,
                          "minLength": 1,
                          "type": "string"
                        },
                        "type": {
                          "default": "text",
                          "enum": [
                            "text",
                            "logo",
                            "both"
                          ],
                          "type": "string"
                        }
                      },
                      "required": [
                        "text"
                      ],
                      "type": "object"
                    }
                  },
                  "required": [
                    "id",
                    "name",
                    "version",
                    "watermark"
                  ],
                  "type": "object"
                },
                "maxItems": 30,
                "type": "array"
              },
              "watermarkSize": {
                "maximum": 12,
                "minimum": 3,
                "type": "integer"
              },
              "webWatermarkPresetId": {
                "format": "uuid",
                "nullable": true,
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              }
            },
            "required": [
              "name",
              "tagline",
              "email",
              "phone",
              "logoInitials",
              "color",
              "background",
              "textColor",
              "font",
              "watermarkColor",
              "watermarkOpacity",
              "watermarkPosition",
              "watermarkSize"
            ],
            "type": "object"
          },
          "expectedRevision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          }
        },
        "required": [
          "brand",
          "expectedRevision"
        ],
        "type": "object"
      },
      "PhotographyLogoCandidatesDto": {
        "properties": {
          "logos": {
            "items": {
              "properties": {
                "fileName": {
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                }
              },
              "required": [
                "id",
                "fileName"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "nextCursor": {
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "logos",
          "nextCursor"
        ],
        "type": "object"
      },
      "PhotographyRenditionPreviewDto": {
        "additionalProperties": false,
        "properties": {
          "background": {
            "default": "dark",
            "enum": [
              "light",
              "dark"
            ],
            "type": "string"
          },
          "orientation": {
            "default": "landscape",
            "enum": [
              "portrait",
              "landscape"
            ],
            "type": "string"
          },
          "watermark": {
            "additionalProperties": false,
            "properties": {
              "alignment": {
                "default": "center",
                "enum": [
                  "left",
                  "center",
                  "right"
                ],
                "type": "string"
              },
              "backing": {
                "default": false,
                "type": "boolean"
              },
              "color": {
                "default": "#ffffff",
                "pattern": "^#[\\da-fA-F]{6}$",
                "type": "string"
              },
              "font": {
                "default": "script",
                "enum": [
                  "script",
                  "serif",
                  "sans"
                ],
                "type": "string"
              },
              "logoAssetId": {
                "default": null,
                "format": "uuid",
                "nullable": true,
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "logoPosition": {
                "default": "above",
                "enum": [
                  "above",
                  "below",
                  "left",
                  "right"
                ],
                "type": "string"
              },
              "logoScale": {
                "default": 1,
                "maximum": 4,
                "minimum": 0.25,
                "type": "number"
              },
              "logoVariant": {
                "default": "original",
                "enum": [
                  "original",
                  "light",
                  "dark"
                ],
                "type": "string"
              },
              "margin": {
                "default": 4,
                "maximum": 25,
                "minimum": 0,
                "type": "number"
              },
              "opacity": {
                "default": 45,
                "maximum": 100,
                "minimum": 1,
                "type": "number"
              },
              "outline": {
                "default": false,
                "type": "boolean"
              },
              "pattern": {
                "default": "signature",
                "enum": [
                  "signature",
                  "centre",
                  "diagonal",
                  "tile"
                ],
                "type": "string"
              },
              "position": {
                "default": "bottom-right",
                "enum": [
                  "top-left",
                  "top-right",
                  "bottom-left",
                  "bottom-right",
                  "center"
                ],
                "type": "string"
              },
              "rotation": {
                "default": 0,
                "maximum": 180,
                "minimum": -180,
                "type": "number"
              },
              "secondLine": {
                "default": "",
                "maxLength": 200,
                "type": "string"
              },
              "size": {
                "default": 6,
                "maximum": 30,
                "minimum": 1,
                "type": "number"
              },
              "spacing": {
                "default": 6,
                "maximum": 100,
                "minimum": 0,
                "type": "number"
              },
              "text": {
                "maxLength": 200,
                "minLength": 1,
                "type": "string"
              },
              "type": {
                "default": "text",
                "enum": [
                  "text",
                  "logo",
                  "both"
                ],
                "type": "string"
              }
            },
            "required": [
              "text"
            ],
            "type": "object"
          }
        },
        "required": [
          "watermark"
        ],
        "type": "object"
      },
      "PhotographyPhotosDto": {
        "properties": {
          "nextCursor": {
            "nullable": true,
            "type": "string"
          },
          "photos": {
            "items": {
              "properties": {
                "camera": {
                  "type": "string"
                },
                "canRate": {
                  "type": "boolean"
                },
                "capturedAt": {
                  "nullable": true,
                  "type": "string"
                },
                "currentRevisionId": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "eligible": {
                  "type": "boolean"
                },
                "exclusion": {
                  "nullable": true,
                  "type": "string"
                },
                "fileName": {
                  "type": "string"
                },
                "height": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "nullable": true,
                  "type": "integer"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "isRaw": {
                  "type": "boolean"
                },
                "processing": {
                  "enum": [
                    "ready",
                    "pending",
                    "failed"
                  ],
                  "type": "string"
                },
                "rating": {
                  "maximum": 5,
                  "minimum": -1,
                  "nullable": true,
                  "type": "integer"
                },
                "stackCount": {
                  "maximum": 9007199254740991,
                  "minimum": 0,
                  "type": "integer"
                },
                "stackId": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "width": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "nullable": true,
                  "type": "integer"
                }
              },
              "required": [
                "id",
                "fileName",
                "rating",
                "canRate",
                "stackCount",
                "currentRevisionId",
                "camera",
                "capturedAt",
                "isRaw",
                "stackId",
                "width",
                "height",
                "eligible",
                "exclusion",
                "processing"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "nextCursor",
          "photos"
        ],
        "type": "object"
      },
      "PhotographyRatingDto": {
        "additionalProperties": false,
        "properties": {
          "assetId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "rating": {
            "maximum": 5,
            "minimum": -1,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "assetId",
          "rating"
        ],
        "type": "object"
      },
      "PhotographySiteDto": {
        "properties": {
          "revision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "site": {
            "additionalProperties": false,
            "properties": {
              "about": {
                "maxLength": 10000,
                "type": "string"
              },
              "contact": {
                "maxLength": 5000,
                "type": "string"
              },
              "enabled": {
                "type": "boolean"
              },
              "portfolio": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "captureId": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "consent": {
                      "enum": [
                        true
                      ],
                      "type": "boolean"
                    },
                    "shootId": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    }
                  },
                  "required": [
                    "shootId",
                    "captureId",
                    "consent"
                  ],
                  "type": "object"
                },
                "maxItems": 200,
                "type": "array"
              },
              "presentation": {
                "additionalProperties": false,
                "default": {
                  "font": "editorial",
                  "layout": "editorial",
                  "palette": "studio",
                  "spacing": "comfortable"
                },
                "properties": {
                  "font": {
                    "enum": [
                      "editorial",
                      "modern",
                      "script"
                    ],
                    "type": "string"
                  },
                  "layout": {
                    "enum": [
                      "editorial",
                      "grid",
                      "slideshow"
                    ],
                    "type": "string"
                  },
                  "palette": {
                    "enum": [
                      "studio",
                      "ivory",
                      "charcoal"
                    ],
                    "type": "string"
                  },
                  "spacing": {
                    "enum": [
                      "compact",
                      "comfortable",
                      "airy"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "layout",
                  "spacing",
                  "font",
                  "palette"
                ],
                "type": "object"
              },
              "services": {
                "maxLength": 10000,
                "type": "string"
              },
              "title": {
                "maxLength": 200,
                "minLength": 1,
                "type": "string"
              }
            },
            "required": [
              "enabled",
              "title",
              "about",
              "services",
              "contact",
              "portfolio"
            ],
            "type": "object"
          },
          "url": {
            "type": "string"
          }
        },
        "required": [
          "revision",
          "site"
        ],
        "type": "object"
      },
      "PhotographySiteSaveDto": {
        "additionalProperties": false,
        "properties": {
          "expectedRevision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "site": {
            "additionalProperties": false,
            "properties": {
              "about": {
                "maxLength": 10000,
                "type": "string"
              },
              "contact": {
                "maxLength": 5000,
                "type": "string"
              },
              "enabled": {
                "type": "boolean"
              },
              "portfolio": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "captureId": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "consent": {
                      "enum": [
                        true
                      ],
                      "type": "boolean"
                    },
                    "shootId": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    }
                  },
                  "required": [
                    "shootId",
                    "captureId",
                    "consent"
                  ],
                  "type": "object"
                },
                "maxItems": 200,
                "type": "array"
              },
              "presentation": {
                "additionalProperties": false,
                "default": {
                  "font": "editorial",
                  "layout": "editorial",
                  "palette": "studio",
                  "spacing": "comfortable"
                },
                "properties": {
                  "font": {
                    "enum": [
                      "editorial",
                      "modern",
                      "script"
                    ],
                    "type": "string"
                  },
                  "layout": {
                    "enum": [
                      "editorial",
                      "grid",
                      "slideshow"
                    ],
                    "type": "string"
                  },
                  "palette": {
                    "enum": [
                      "studio",
                      "ivory",
                      "charcoal"
                    ],
                    "type": "string"
                  },
                  "spacing": {
                    "enum": [
                      "compact",
                      "comfortable",
                      "airy"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "layout",
                  "spacing",
                  "font",
                  "palette"
                ],
                "type": "object"
              },
              "services": {
                "maxLength": 10000,
                "type": "string"
              },
              "title": {
                "maxLength": 200,
                "minLength": 1,
                "type": "string"
              }
            },
            "required": [
              "enabled",
              "title",
              "about",
              "services",
              "contact",
              "portfolio"
            ],
            "type": "object"
          }
        },
        "required": [
          "expectedRevision",
          "site"
        ],
        "type": "object"
      },
      "PhotographyPublicSiteDto": {
        "additionalProperties": false,
        "properties": {
          "about": {
            "maxLength": 10000,
            "type": "string"
          },
          "brand": {
            "properties": {
              "background": {
                "type": "string"
              },
              "color": {
                "type": "string"
              },
              "email": {
                "type": "string"
              },
              "font": {
                "type": "string"
              },
              "logoUrl": {
                "nullable": true,
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "phone": {
                "type": "string"
              },
              "tagline": {
                "type": "string"
              },
              "textColor": {
                "type": "string"
              }
            },
            "required": [
              "name",
              "tagline",
              "email",
              "phone",
              "color",
              "background",
              "textColor",
              "font",
              "logoUrl"
            ],
            "type": "object"
          },
          "contact": {
            "maxLength": 5000,
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "portfolio": {
            "items": {
              "properties": {
                "captureId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "shootId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "shootId",
                "captureId",
                "url"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "presentation": {
            "additionalProperties": false,
            "default": {
              "font": "editorial",
              "layout": "editorial",
              "palette": "studio",
              "spacing": "comfortable"
            },
            "properties": {
              "font": {
                "enum": [
                  "editorial",
                  "modern",
                  "script"
                ],
                "type": "string"
              },
              "layout": {
                "enum": [
                  "editorial",
                  "grid",
                  "slideshow"
                ],
                "type": "string"
              },
              "palette": {
                "enum": [
                  "studio",
                  "ivory",
                  "charcoal"
                ],
                "type": "string"
              },
              "spacing": {
                "enum": [
                  "compact",
                  "comfortable",
                  "airy"
                ],
                "type": "string"
              }
            },
            "required": [
              "layout",
              "spacing",
              "font",
              "palette"
            ],
            "type": "object"
          },
          "services": {
            "maxLength": 10000,
            "type": "string"
          },
          "title": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "about",
          "brand",
          "contact",
          "enabled",
          "portfolio",
          "services",
          "title"
        ],
        "type": "object"
      },
      "PhotographyWorkflowListDto": {
        "properties": {
          "galleries": {
            "items": {
              "properties": {
                "expiresAt": {
                  "format": "date-time",
                  "nullable": true,
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                  "type": "string"
                },
                "mode": {
                  "type": "string"
                },
                "pendingEdits": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "type": "integer"
                },
                "published": {
                  "type": "boolean"
                },
                "readyCount": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "type": "integer"
                },
                "revision": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                  "type": "string"
                },
                "selectionDeadline": {
                  "format": "date-time",
                  "nullable": true,
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                  "type": "string"
                },
                "shootId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "submittedRounds": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "type": "integer"
                },
                "title": {
                  "type": "string"
                },
                "unpaidOrders": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "type": "integer"
                }
              },
              "required": [
                "shootId",
                "revision",
                "title",
                "mode",
                "selectionDeadline",
                "expiresAt",
                "published",
                "submittedRounds",
                "unpaidOrders",
                "readyCount",
                "pendingEdits"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "galleries"
        ],
        "type": "object"
      },
      "PhotographyWorkflowDto": {
        "properties": {
          "approvals": {
            "items": {
              "properties": {
                "approved": {
                  "type": "boolean"
                },
                "captureId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "createdAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                },
                "recipientId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "revisionId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                }
              },
              "required": [
                "recipientId",
                "captureId",
                "revisionId",
                "approved",
                "note",
                "createdAt"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "approvedVersions": {
            "items": {
              "properties": {
                "approvedAt": {
                  "type": "string"
                },
                "captureId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "revisionId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                }
              },
              "required": [
                "captureId",
                "revisionId",
                "approvedAt"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "captures": {
            "items": {
              "properties": {
                "approvalRequested": {
                  "type": "boolean"
                },
                "approvedRevisionId": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "assetId": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "assetIds": {
                  "items": {
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                    "type": "string"
                  },
                  "maxItems": 10000,
                  "type": "array"
                },
                "camera": {
                  "nullable": true,
                  "type": "string"
                },
                "capturedAt": {
                  "nullable": true,
                  "type": "string"
                },
                "chapterId": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "checksum": {
                  "nullable": true,
                  "type": "string"
                },
                "eligible": {
                  "type": "boolean"
                },
                "exclusion": {
                  "nullable": true,
                  "type": "string"
                },
                "fileName": {
                  "nullable": true,
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "isRaw": {
                  "nullable": true,
                  "type": "boolean"
                },
                "number": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "type": "integer"
                },
                "offsetSeconds": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "type": "integer"
                },
                "photographer": {
                  "type": "string"
                },
                "position": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "type": "integer"
                },
                "processing": {
                  "enum": [
                    "ready",
                    "pending",
                    "failed"
                  ],
                  "type": "string"
                },
                "proofRevisionId": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "rating": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "nullable": true,
                  "type": "integer"
                },
                "state": {
                  "enum": [
                    "imported",
                    "selected",
                    "approval-requested",
                    "approved",
                    "delivered"
                  ],
                  "type": "string"
                },
                "withheld": {
                  "type": "boolean"
                }
              },
              "required": [
                "id",
                "number",
                "assetId",
                "assetIds",
                "checksum",
                "fileName",
                "camera",
                "capturedAt",
                "offsetSeconds",
                "photographer",
                "chapterId",
                "position",
                "withheld",
                "rating",
                "isRaw",
                "eligible",
                "exclusion",
                "processing",
                "proofRevisionId",
                "approvedRevisionId",
                "approvalRequested",
                "state"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "chapters": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "coverCaptureId": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "description": {
                  "maxLength": 2000,
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "position": {
                  "maximum": 10000,
                  "minimum": 0,
                  "type": "integer"
                },
                "title": {
                  "maxLength": 200,
                  "minLength": 1,
                  "type": "string"
                }
              },
              "required": [
                "id",
                "title",
                "description",
                "position",
                "coverCaptureId"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "config": {
            "additionalProperties": false,
            "properties": {
              "additionalPrice": {
                "maximum": 100000000,
                "minimum": 0,
                "type": "integer"
              },
              "bundles": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "count": {
                      "maximum": 10000,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "price": {
                      "maximum": 100000000,
                      "minimum": 0,
                      "type": "integer"
                    }
                  },
                  "required": [
                    "count",
                    "price"
                  ],
                  "type": "object"
                },
                "maxItems": 20,
                "type": "array"
              },
              "collectionPrice": {
                "maximum": 100000000,
                "minimum": 0,
                "nullable": true,
                "type": "integer"
              },
              "currency": {
                "pattern": "^[A-Z]{3}$",
                "type": "string"
              },
              "downloadOutputs": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "key": {
                      "pattern": "^[a-z][a-z0-9-]{0,39}$",
                      "type": "string"
                    },
                    "kind": {
                      "enum": [
                        "print",
                        "web",
                        "social"
                      ],
                      "type": "string"
                    },
                    "label": {
                      "maxLength": 100,
                      "minLength": 1,
                      "type": "string"
                    },
                    "maxEdge": {
                      "maximum": 65535,
                      "minimum": 320,
                      "type": "integer"
                    },
                    "watermark": {
                      "additionalProperties": false,
                      "nullable": true,
                      "properties": {
                        "alignment": {
                          "default": "center",
                          "enum": [
                            "left",
                            "center",
                            "right"
                          ],
                          "type": "string"
                        },
                        "backing": {
                          "default": false,
                          "type": "boolean"
                        },
                        "color": {
                          "default": "#ffffff",
                          "pattern": "^#[\\da-fA-F]{6}$",
                          "type": "string"
                        },
                        "font": {
                          "default": "script",
                          "enum": [
                            "script",
                            "serif",
                            "sans"
                          ],
                          "type": "string"
                        },
                        "logoAssetId": {
                          "default": null,
                          "format": "uuid",
                          "nullable": true,
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                          "type": "string"
                        },
                        "logoPosition": {
                          "default": "above",
                          "enum": [
                            "above",
                            "below",
                            "left",
                            "right"
                          ],
                          "type": "string"
                        },
                        "logoScale": {
                          "default": 1,
                          "maximum": 4,
                          "minimum": 0.25,
                          "type": "number"
                        },
                        "logoVariant": {
                          "default": "original",
                          "enum": [
                            "original",
                            "light",
                            "dark"
                          ],
                          "type": "string"
                        },
                        "margin": {
                          "default": 4,
                          "maximum": 25,
                          "minimum": 0,
                          "type": "number"
                        },
                        "opacity": {
                          "default": 45,
                          "maximum": 100,
                          "minimum": 1,
                          "type": "number"
                        },
                        "outline": {
                          "default": false,
                          "type": "boolean"
                        },
                        "pattern": {
                          "default": "signature",
                          "enum": [
                            "signature",
                            "centre",
                            "diagonal",
                            "tile"
                          ],
                          "type": "string"
                        },
                        "position": {
                          "default": "bottom-right",
                          "enum": [
                            "top-left",
                            "top-right",
                            "bottom-left",
                            "bottom-right",
                            "center"
                          ],
                          "type": "string"
                        },
                        "rotation": {
                          "default": 0,
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        },
                        "secondLine": {
                          "default": "",
                          "maxLength": 200,
                          "type": "string"
                        },
                        "size": {
                          "default": 6,
                          "maximum": 30,
                          "minimum": 1,
                          "type": "number"
                        },
                        "spacing": {
                          "default": 6,
                          "maximum": 100,
                          "minimum": 0,
                          "type": "number"
                        },
                        "text": {
                          "maxLength": 200,
                          "minLength": 1,
                          "type": "string"
                        },
                        "type": {
                          "default": "text",
                          "enum": [
                            "text",
                            "logo",
                            "both"
                          ],
                          "type": "string"
                        }
                      },
                      "required": [
                        "text"
                      ],
                      "type": "object"
                    }
                  },
                  "required": [
                    "key",
                    "label",
                    "kind",
                    "maxEdge",
                    "watermark"
                  ],
                  "type": "object"
                },
                "maxItems": 6,
                "minItems": 1,
                "type": "array"
              },
              "downloadWatermark": {
                "additionalProperties": false,
                "nullable": true,
                "properties": {
                  "alignment": {
                    "default": "center",
                    "enum": [
                      "left",
                      "center",
                      "right"
                    ],
                    "type": "string"
                  },
                  "backing": {
                    "default": false,
                    "type": "boolean"
                  },
                  "color": {
                    "default": "#ffffff",
                    "pattern": "^#[\\da-fA-F]{6}$",
                    "type": "string"
                  },
                  "font": {
                    "default": "script",
                    "enum": [
                      "script",
                      "serif",
                      "sans"
                    ],
                    "type": "string"
                  },
                  "logoAssetId": {
                    "default": null,
                    "format": "uuid",
                    "nullable": true,
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                    "type": "string"
                  },
                  "logoPosition": {
                    "default": "above",
                    "enum": [
                      "above",
                      "below",
                      "left",
                      "right"
                    ],
                    "type": "string"
                  },
                  "logoScale": {
                    "default": 1,
                    "maximum": 4,
                    "minimum": 0.25,
                    "type": "number"
                  },
                  "logoVariant": {
                    "default": "original",
                    "enum": [
                      "original",
                      "light",
                      "dark"
                    ],
                    "type": "string"
                  },
                  "margin": {
                    "default": 4,
                    "maximum": 25,
                    "minimum": 0,
                    "type": "number"
                  },
                  "opacity": {
                    "default": 45,
                    "maximum": 100,
                    "minimum": 1,
                    "type": "number"
                  },
                  "outline": {
                    "default": false,
                    "type": "boolean"
                  },
                  "pattern": {
                    "default": "signature",
                    "enum": [
                      "signature",
                      "centre",
                      "diagonal",
                      "tile"
                    ],
                    "type": "string"
                  },
                  "position": {
                    "default": "bottom-right",
                    "enum": [
                      "top-left",
                      "top-right",
                      "bottom-left",
                      "bottom-right",
                      "center"
                    ],
                    "type": "string"
                  },
                  "rotation": {
                    "default": 0,
                    "maximum": 180,
                    "minimum": -180,
                    "type": "number"
                  },
                  "secondLine": {
                    "default": "",
                    "maxLength": 200,
                    "type": "string"
                  },
                  "size": {
                    "default": 6,
                    "maximum": 30,
                    "minimum": 1,
                    "type": "number"
                  },
                  "spacing": {
                    "default": 6,
                    "maximum": 100,
                    "minimum": 0,
                    "type": "number"
                  },
                  "text": {
                    "maxLength": 200,
                    "minLength": 1,
                    "type": "string"
                  },
                  "type": {
                    "default": "text",
                    "enum": [
                      "text",
                      "logo",
                      "both"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "text"
                ],
                "type": "object"
              },
              "expiresAt": {
                "format": "date-time",
                "nullable": true,
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                "type": "string"
              },
              "includedCount": {
                "maximum": 10000,
                "minimum": 0,
                "type": "integer"
              },
              "mode": {
                "enum": [
                  "edited-delivery",
                  "select-before-editing",
                  "sell-by-photo"
                ],
                "type": "string"
              },
              "paymentTiming": {
                "enum": [
                  "before-editing",
                  "after-approval"
                ],
                "type": "string"
              },
              "presentation": {
                "additionalProperties": false,
                "properties": {
                  "blocks": {
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "captureIds": {
                          "items": {
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                            "type": "string"
                          },
                          "maxItems": 1000,
                          "type": "array"
                        },
                        "chapterId": {
                          "format": "uuid",
                          "nullable": true,
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                          "type": "string"
                        },
                        "id": {
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                          "type": "string"
                        },
                        "selection": {
                          "enum": [
                            "automatic",
                            "explicit"
                          ],
                          "type": "string"
                        },
                        "text": {
                          "maxLength": 2000,
                          "type": "string"
                        },
                        "type": {
                          "enum": [
                            "chapter",
                            "grid",
                            "full",
                            "pair",
                            "caption",
                            "slideshow"
                          ],
                          "type": "string"
                        }
                      },
                      "required": [
                        "id",
                        "type",
                        "chapterId",
                        "captureIds",
                        "text"
                      ],
                      "type": "object"
                    },
                    "maxItems": 100,
                    "type": "array"
                  },
                  "coverCaptureId": {
                    "format": "uuid",
                    "nullable": true,
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                    "type": "string"
                  },
                  "coverFocal": {
                    "maximum": 100,
                    "minimum": 0,
                    "type": "number"
                  },
                  "coverTreatment": {
                    "enum": [
                      "full",
                      "split",
                      "quiet"
                    ],
                    "type": "string"
                  },
                  "font": {
                    "enum": [
                      "editorial",
                      "modern",
                      "script"
                    ],
                    "type": "string"
                  },
                  "introduction": {
                    "maxLength": 5000,
                    "type": "string"
                  },
                  "palette": {
                    "enum": [
                      "studio",
                      "ivory",
                      "charcoal"
                    ],
                    "type": "string"
                  },
                  "showChapters": {
                    "type": "boolean"
                  },
                  "showNumbers": {
                    "type": "boolean"
                  },
                  "spacing": {
                    "enum": [
                      "compact",
                      "comfortable",
                      "airy"
                    ],
                    "type": "string"
                  },
                  "template": {
                    "enum": [
                      "wedding",
                      "portrait",
                      "fine-art",
                      "proofing"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "template",
                  "coverCaptureId",
                  "coverTreatment",
                  "coverFocal",
                  "font",
                  "palette",
                  "spacing",
                  "introduction",
                  "showChapters",
                  "showNumbers"
                ],
                "type": "object"
              },
              "proofWatermark": {
                "additionalProperties": false,
                "properties": {
                  "alignment": {
                    "default": "center",
                    "enum": [
                      "left",
                      "center",
                      "right"
                    ],
                    "type": "string"
                  },
                  "backing": {
                    "default": false,
                    "type": "boolean"
                  },
                  "color": {
                    "default": "#ffffff",
                    "pattern": "^#[\\da-fA-F]{6}$",
                    "type": "string"
                  },
                  "font": {
                    "default": "script",
                    "enum": [
                      "script",
                      "serif",
                      "sans"
                    ],
                    "type": "string"
                  },
                  "logoAssetId": {
                    "default": null,
                    "format": "uuid",
                    "nullable": true,
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                    "type": "string"
                  },
                  "logoPosition": {
                    "default": "above",
                    "enum": [
                      "above",
                      "below",
                      "left",
                      "right"
                    ],
                    "type": "string"
                  },
                  "logoScale": {
                    "default": 1,
                    "maximum": 4,
                    "minimum": 0.25,
                    "type": "number"
                  },
                  "logoVariant": {
                    "default": "original",
                    "enum": [
                      "original",
                      "light",
                      "dark"
                    ],
                    "type": "string"
                  },
                  "margin": {
                    "default": 4,
                    "maximum": 25,
                    "minimum": 0,
                    "type": "number"
                  },
                  "opacity": {
                    "default": 45,
                    "maximum": 100,
                    "minimum": 1,
                    "type": "number"
                  },
                  "outline": {
                    "default": false,
                    "type": "boolean"
                  },
                  "pattern": {
                    "default": "signature",
                    "enum": [
                      "signature",
                      "centre",
                      "diagonal",
                      "tile"
                    ],
                    "type": "string"
                  },
                  "position": {
                    "default": "bottom-right",
                    "enum": [
                      "top-left",
                      "top-right",
                      "bottom-left",
                      "bottom-right",
                      "center"
                    ],
                    "type": "string"
                  },
                  "rotation": {
                    "default": 0,
                    "maximum": 180,
                    "minimum": -180,
                    "type": "number"
                  },
                  "secondLine": {
                    "default": "",
                    "maxLength": 200,
                    "type": "string"
                  },
                  "size": {
                    "default": 6,
                    "maximum": 30,
                    "minimum": 1,
                    "type": "number"
                  },
                  "spacing": {
                    "default": 6,
                    "maximum": 100,
                    "minimum": 0,
                    "type": "number"
                  },
                  "text": {
                    "maxLength": 200,
                    "minLength": 1,
                    "type": "string"
                  },
                  "type": {
                    "default": "text",
                    "enum": [
                      "text",
                      "logo",
                      "both"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "text"
                ],
                "type": "object"
              },
              "selectionDeadline": {
                "format": "date-time",
                "nullable": true,
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                "type": "string"
              },
              "terms": {
                "maxLength": 5000,
                "type": "string"
              },
              "title": {
                "maxLength": 200,
                "minLength": 1,
                "type": "string"
              },
              "turnaroundDays": {
                "maximum": 365,
                "minimum": 0,
                "type": "integer"
              },
              "webWatermark": {
                "additionalProperties": false,
                "nullable": true,
                "properties": {
                  "alignment": {
                    "default": "center",
                    "enum": [
                      "left",
                      "center",
                      "right"
                    ],
                    "type": "string"
                  },
                  "backing": {
                    "default": false,
                    "type": "boolean"
                  },
                  "color": {
                    "default": "#ffffff",
                    "pattern": "^#[\\da-fA-F]{6}$",
                    "type": "string"
                  },
                  "font": {
                    "default": "script",
                    "enum": [
                      "script",
                      "serif",
                      "sans"
                    ],
                    "type": "string"
                  },
                  "logoAssetId": {
                    "default": null,
                    "format": "uuid",
                    "nullable": true,
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                    "type": "string"
                  },
                  "logoPosition": {
                    "default": "above",
                    "enum": [
                      "above",
                      "below",
                      "left",
                      "right"
                    ],
                    "type": "string"
                  },
                  "logoScale": {
                    "default": 1,
                    "maximum": 4,
                    "minimum": 0.25,
                    "type": "number"
                  },
                  "logoVariant": {
                    "default": "original",
                    "enum": [
                      "original",
                      "light",
                      "dark"
                    ],
                    "type": "string"
                  },
                  "margin": {
                    "default": 4,
                    "maximum": 25,
                    "minimum": 0,
                    "type": "number"
                  },
                  "opacity": {
                    "default": 45,
                    "maximum": 100,
                    "minimum": 1,
                    "type": "number"
                  },
                  "outline": {
                    "default": false,
                    "type": "boolean"
                  },
                  "pattern": {
                    "default": "signature",
                    "enum": [
                      "signature",
                      "centre",
                      "diagonal",
                      "tile"
                    ],
                    "type": "string"
                  },
                  "position": {
                    "default": "bottom-right",
                    "enum": [
                      "top-left",
                      "top-right",
                      "bottom-left",
                      "bottom-right",
                      "center"
                    ],
                    "type": "string"
                  },
                  "rotation": {
                    "default": 0,
                    "maximum": 180,
                    "minimum": -180,
                    "type": "number"
                  },
                  "secondLine": {
                    "default": "",
                    "maxLength": 200,
                    "type": "string"
                  },
                  "size": {
                    "default": 6,
                    "maximum": 30,
                    "minimum": 1,
                    "type": "number"
                  },
                  "spacing": {
                    "default": 6,
                    "maximum": 100,
                    "minimum": 0,
                    "type": "number"
                  },
                  "text": {
                    "maxLength": 200,
                    "minLength": 1,
                    "type": "string"
                  },
                  "type": {
                    "default": "text",
                    "enum": [
                      "text",
                      "logo",
                      "both"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "text"
                ],
                "type": "object"
              }
            },
            "required": [
              "presentation",
              "title",
              "mode",
              "paymentTiming",
              "currency",
              "includedCount",
              "additionalPrice",
              "collectionPrice",
              "bundles",
              "terms",
              "selectionDeadline",
              "expiresAt",
              "turnaroundDays",
              "proofWatermark",
              "webWatermark",
              "downloadWatermark"
            ],
            "type": "object"
          },
          "ordering": {
            "enum": [
              "chronological",
              "photographer",
              "manual",
              "chapters"
            ],
            "type": "string"
          },
          "orders": {
            "items": {
              "properties": {
                "acceptedAt": {
                  "nullable": true,
                  "type": "string"
                },
                "captureIds": {
                  "items": {
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                    "type": "string"
                  },
                  "maxItems": 10000,
                  "type": "array"
                },
                "createdAt": {
                  "type": "string"
                },
                "currency": {
                  "type": "string"
                },
                "editingBlocked": {
                  "type": "boolean"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "items": {
                  "items": {
                    "properties": {
                      "approved": {
                        "type": "boolean"
                      },
                      "captureId": {
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "clientApprovalRequired": {
                        "type": "boolean"
                      },
                      "exportSpec": {
                        "properties": {
                          "format": {
                            "enum": [
                              "jpeg"
                            ],
                            "type": "string"
                          },
                          "maxEdge": {
                            "maximum": 65535,
                            "minimum": 320,
                            "type": "integer"
                          },
                          "quality": {
                            "enum": [
                              90
                            ],
                            "type": "number"
                          }
                        },
                        "required": [
                          "format",
                          "quality",
                          "maxEdge"
                        ],
                        "type": "object"
                      },
                      "outputs": {
                        "items": {
                          "properties": {
                            "approvalPreviewUrl": {
                              "nullable": true,
                              "type": "string"
                            },
                            "approved": {
                              "type": "boolean"
                            },
                            "blockedReason": {
                              "enum": [
                                "permission",
                                "order",
                                "payment",
                                "approval",
                                "render"
                              ],
                              "nullable": true,
                              "type": "string"
                            },
                            "branded": {
                              "type": "boolean"
                            },
                            "canDownload": {
                              "type": "boolean"
                            },
                            "clientApprovalRequired": {
                              "type": "boolean"
                            },
                            "exportSpec": {
                              "properties": {
                                "format": {
                                  "enum": [
                                    "jpeg"
                                  ],
                                  "type": "string"
                                },
                                "maxEdge": {
                                  "maximum": 65535,
                                  "minimum": 320,
                                  "type": "integer"
                                },
                                "quality": {
                                  "enum": [
                                    90
                                  ],
                                  "type": "number"
                                }
                              },
                              "required": [
                                "format",
                                "quality",
                                "maxEdge"
                              ],
                              "type": "object"
                            },
                            "id": {
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                              "type": "string"
                            },
                            "kind": {
                              "enum": [
                                "print",
                                "web",
                                "social"
                              ],
                              "type": "string"
                            },
                            "label": {
                              "type": "string"
                            },
                            "ready": {
                              "type": "boolean"
                            },
                            "renderStatus": {
                              "enum": [
                                "awaiting-approval",
                                "preparing",
                                "ready"
                              ],
                              "type": "string"
                            },
                            "revisionId": {
                              "format": "uuid",
                              "nullable": true,
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                              "type": "string"
                            },
                            "url": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "id",
                            "label",
                            "kind",
                            "revisionId",
                            "approved",
                            "clientApprovalRequired",
                            "ready",
                            "renderStatus",
                            "branded",
                            "approvalPreviewUrl",
                            "exportSpec",
                            "url"
                          ],
                          "type": "object"
                        },
                        "type": "array"
                      },
                      "ready": {
                        "type": "boolean"
                      },
                      "revisionId": {
                        "format": "uuid",
                        "nullable": true,
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      }
                    },
                    "required": [
                      "captureId",
                      "revisionId",
                      "approved",
                      "clientApprovalRequired",
                      "ready",
                      "exportSpec",
                      "outputs"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "paymentTiming": {
                  "enum": [
                    "before-editing",
                    "after-approval"
                  ],
                  "type": "string"
                },
                "pricing": {
                  "properties": {
                    "additionalPrice": {
                      "maximum": 100000000,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "bundles": {
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "count": {
                            "maximum": 10000,
                            "minimum": 1,
                            "type": "integer"
                          },
                          "price": {
                            "maximum": 100000000,
                            "minimum": 0,
                            "type": "integer"
                          }
                        },
                        "required": [
                          "count",
                          "price"
                        ],
                        "type": "object"
                      },
                      "maxItems": 20,
                      "type": "array"
                    },
                    "collectionPrice": {
                      "maximum": 100000000,
                      "minimum": 0,
                      "nullable": true,
                      "type": "integer"
                    },
                    "includedCount": {
                      "maximum": 9007199254740991,
                      "minimum": -9007199254740991,
                      "type": "integer"
                    },
                    "option": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "includedCount",
                    "additionalPrice",
                    "collectionPrice",
                    "bundles",
                    "option"
                  ],
                  "type": "object"
                },
                "readyCount": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "type": "integer"
                },
                "recipientId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "roundId": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "status": {
                  "enum": [
                    "quoted",
                    "accepted",
                    "settled",
                    "free",
                    "refunded",
                    "cancelled"
                  ],
                  "type": "string"
                },
                "terms": {
                  "type": "string"
                },
                "total": {
                  "maximum": 100000000,
                  "minimum": 0,
                  "type": "integer"
                }
              },
              "required": [
                "id",
                "recipientId",
                "roundId",
                "status",
                "currency",
                "total",
                "captureIds",
                "terms",
                "paymentTiming",
                "pricing",
                "createdAt",
                "acceptedAt",
                "items",
                "readyCount",
                "editingBlocked"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "pendingEdits": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "presets": {
            "items": {
              "properties": {
                "config": {
                  "additionalProperties": false,
                  "properties": {
                    "additionalPrice": {
                      "maximum": 100000000,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "bundles": {
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "count": {
                            "maximum": 10000,
                            "minimum": 1,
                            "type": "integer"
                          },
                          "price": {
                            "maximum": 100000000,
                            "minimum": 0,
                            "type": "integer"
                          }
                        },
                        "required": [
                          "count",
                          "price"
                        ],
                        "type": "object"
                      },
                      "maxItems": 20,
                      "type": "array"
                    },
                    "collectionPrice": {
                      "maximum": 100000000,
                      "minimum": 0,
                      "nullable": true,
                      "type": "integer"
                    },
                    "currency": {
                      "pattern": "^[A-Z]{3}$",
                      "type": "string"
                    },
                    "downloadOutputs": {
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "key": {
                            "pattern": "^[a-z][a-z0-9-]{0,39}$",
                            "type": "string"
                          },
                          "kind": {
                            "enum": [
                              "print",
                              "web",
                              "social"
                            ],
                            "type": "string"
                          },
                          "label": {
                            "maxLength": 100,
                            "minLength": 1,
                            "type": "string"
                          },
                          "maxEdge": {
                            "maximum": 65535,
                            "minimum": 320,
                            "type": "integer"
                          },
                          "watermark": {
                            "additionalProperties": false,
                            "nullable": true,
                            "properties": {
                              "alignment": {
                                "default": "center",
                                "enum": [
                                  "left",
                                  "center",
                                  "right"
                                ],
                                "type": "string"
                              },
                              "backing": {
                                "default": false,
                                "type": "boolean"
                              },
                              "color": {
                                "default": "#ffffff",
                                "pattern": "^#[\\da-fA-F]{6}$",
                                "type": "string"
                              },
                              "font": {
                                "default": "script",
                                "enum": [
                                  "script",
                                  "serif",
                                  "sans"
                                ],
                                "type": "string"
                              },
                              "logoAssetId": {
                                "default": null,
                                "format": "uuid",
                                "nullable": true,
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                "type": "string"
                              },
                              "logoPosition": {
                                "default": "above",
                                "enum": [
                                  "above",
                                  "below",
                                  "left",
                                  "right"
                                ],
                                "type": "string"
                              },
                              "logoScale": {
                                "default": 1,
                                "maximum": 4,
                                "minimum": 0.25,
                                "type": "number"
                              },
                              "logoVariant": {
                                "default": "original",
                                "enum": [
                                  "original",
                                  "light",
                                  "dark"
                                ],
                                "type": "string"
                              },
                              "margin": {
                                "default": 4,
                                "maximum": 25,
                                "minimum": 0,
                                "type": "number"
                              },
                              "opacity": {
                                "default": 45,
                                "maximum": 100,
                                "minimum": 1,
                                "type": "number"
                              },
                              "outline": {
                                "default": false,
                                "type": "boolean"
                              },
                              "pattern": {
                                "default": "signature",
                                "enum": [
                                  "signature",
                                  "centre",
                                  "diagonal",
                                  "tile"
                                ],
                                "type": "string"
                              },
                              "position": {
                                "default": "bottom-right",
                                "enum": [
                                  "top-left",
                                  "top-right",
                                  "bottom-left",
                                  "bottom-right",
                                  "center"
                                ],
                                "type": "string"
                              },
                              "rotation": {
                                "default": 0,
                                "maximum": 180,
                                "minimum": -180,
                                "type": "number"
                              },
                              "secondLine": {
                                "default": "",
                                "maxLength": 200,
                                "type": "string"
                              },
                              "size": {
                                "default": 6,
                                "maximum": 30,
                                "minimum": 1,
                                "type": "number"
                              },
                              "spacing": {
                                "default": 6,
                                "maximum": 100,
                                "minimum": 0,
                                "type": "number"
                              },
                              "text": {
                                "maxLength": 200,
                                "minLength": 1,
                                "type": "string"
                              },
                              "type": {
                                "default": "text",
                                "enum": [
                                  "text",
                                  "logo",
                                  "both"
                                ],
                                "type": "string"
                              }
                            },
                            "required": [
                              "text"
                            ],
                            "type": "object"
                          }
                        },
                        "required": [
                          "key",
                          "label",
                          "kind",
                          "maxEdge",
                          "watermark"
                        ],
                        "type": "object"
                      },
                      "maxItems": 6,
                      "minItems": 1,
                      "type": "array"
                    },
                    "downloadWatermark": {
                      "additionalProperties": false,
                      "nullable": true,
                      "properties": {
                        "alignment": {
                          "default": "center",
                          "enum": [
                            "left",
                            "center",
                            "right"
                          ],
                          "type": "string"
                        },
                        "backing": {
                          "default": false,
                          "type": "boolean"
                        },
                        "color": {
                          "default": "#ffffff",
                          "pattern": "^#[\\da-fA-F]{6}$",
                          "type": "string"
                        },
                        "font": {
                          "default": "script",
                          "enum": [
                            "script",
                            "serif",
                            "sans"
                          ],
                          "type": "string"
                        },
                        "logoAssetId": {
                          "default": null,
                          "format": "uuid",
                          "nullable": true,
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                          "type": "string"
                        },
                        "logoPosition": {
                          "default": "above",
                          "enum": [
                            "above",
                            "below",
                            "left",
                            "right"
                          ],
                          "type": "string"
                        },
                        "logoScale": {
                          "default": 1,
                          "maximum": 4,
                          "minimum": 0.25,
                          "type": "number"
                        },
                        "logoVariant": {
                          "default": "original",
                          "enum": [
                            "original",
                            "light",
                            "dark"
                          ],
                          "type": "string"
                        },
                        "margin": {
                          "default": 4,
                          "maximum": 25,
                          "minimum": 0,
                          "type": "number"
                        },
                        "opacity": {
                          "default": 45,
                          "maximum": 100,
                          "minimum": 1,
                          "type": "number"
                        },
                        "outline": {
                          "default": false,
                          "type": "boolean"
                        },
                        "pattern": {
                          "default": "signature",
                          "enum": [
                            "signature",
                            "centre",
                            "diagonal",
                            "tile"
                          ],
                          "type": "string"
                        },
                        "position": {
                          "default": "bottom-right",
                          "enum": [
                            "top-left",
                            "top-right",
                            "bottom-left",
                            "bottom-right",
                            "center"
                          ],
                          "type": "string"
                        },
                        "rotation": {
                          "default": 0,
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        },
                        "secondLine": {
                          "default": "",
                          "maxLength": 200,
                          "type": "string"
                        },
                        "size": {
                          "default": 6,
                          "maximum": 30,
                          "minimum": 1,
                          "type": "number"
                        },
                        "spacing": {
                          "default": 6,
                          "maximum": 100,
                          "minimum": 0,
                          "type": "number"
                        },
                        "text": {
                          "maxLength": 200,
                          "minLength": 1,
                          "type": "string"
                        },
                        "type": {
                          "default": "text",
                          "enum": [
                            "text",
                            "logo",
                            "both"
                          ],
                          "type": "string"
                        }
                      },
                      "required": [
                        "text"
                      ],
                      "type": "object"
                    },
                    "expiresAt": {
                      "format": "date-time",
                      "nullable": true,
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                      "type": "string"
                    },
                    "includedCount": {
                      "maximum": 10000,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "mode": {
                      "enum": [
                        "edited-delivery",
                        "select-before-editing",
                        "sell-by-photo"
                      ],
                      "type": "string"
                    },
                    "paymentTiming": {
                      "enum": [
                        "before-editing",
                        "after-approval"
                      ],
                      "type": "string"
                    },
                    "presentation": {
                      "additionalProperties": false,
                      "properties": {
                        "blocks": {
                          "items": {
                            "additionalProperties": false,
                            "properties": {
                              "captureIds": {
                                "items": {
                                  "format": "uuid",
                                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                  "type": "string"
                                },
                                "maxItems": 1000,
                                "type": "array"
                              },
                              "chapterId": {
                                "format": "uuid",
                                "nullable": true,
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                "type": "string"
                              },
                              "id": {
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                "type": "string"
                              },
                              "selection": {
                                "enum": [
                                  "automatic",
                                  "explicit"
                                ],
                                "type": "string"
                              },
                              "text": {
                                "maxLength": 2000,
                                "type": "string"
                              },
                              "type": {
                                "enum": [
                                  "chapter",
                                  "grid",
                                  "full",
                                  "pair",
                                  "caption",
                                  "slideshow"
                                ],
                                "type": "string"
                              }
                            },
                            "required": [
                              "id",
                              "type",
                              "chapterId",
                              "captureIds",
                              "text"
                            ],
                            "type": "object"
                          },
                          "maxItems": 100,
                          "type": "array"
                        },
                        "coverCaptureId": {
                          "format": "uuid",
                          "nullable": true,
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                          "type": "string"
                        },
                        "coverFocal": {
                          "maximum": 100,
                          "minimum": 0,
                          "type": "number"
                        },
                        "coverTreatment": {
                          "enum": [
                            "full",
                            "split",
                            "quiet"
                          ],
                          "type": "string"
                        },
                        "font": {
                          "enum": [
                            "editorial",
                            "modern",
                            "script"
                          ],
                          "type": "string"
                        },
                        "introduction": {
                          "maxLength": 5000,
                          "type": "string"
                        },
                        "palette": {
                          "enum": [
                            "studio",
                            "ivory",
                            "charcoal"
                          ],
                          "type": "string"
                        },
                        "showChapters": {
                          "type": "boolean"
                        },
                        "showNumbers": {
                          "type": "boolean"
                        },
                        "spacing": {
                          "enum": [
                            "compact",
                            "comfortable",
                            "airy"
                          ],
                          "type": "string"
                        },
                        "template": {
                          "enum": [
                            "wedding",
                            "portrait",
                            "fine-art",
                            "proofing"
                          ],
                          "type": "string"
                        }
                      },
                      "required": [
                        "template",
                        "coverCaptureId",
                        "coverTreatment",
                        "coverFocal",
                        "font",
                        "palette",
                        "spacing",
                        "introduction",
                        "showChapters",
                        "showNumbers"
                      ],
                      "type": "object"
                    },
                    "proofWatermark": {
                      "additionalProperties": false,
                      "properties": {
                        "alignment": {
                          "default": "center",
                          "enum": [
                            "left",
                            "center",
                            "right"
                          ],
                          "type": "string"
                        },
                        "backing": {
                          "default": false,
                          "type": "boolean"
                        },
                        "color": {
                          "default": "#ffffff",
                          "pattern": "^#[\\da-fA-F]{6}$",
                          "type": "string"
                        },
                        "font": {
                          "default": "script",
                          "enum": [
                            "script",
                            "serif",
                            "sans"
                          ],
                          "type": "string"
                        },
                        "logoAssetId": {
                          "default": null,
                          "format": "uuid",
                          "nullable": true,
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                          "type": "string"
                        },
                        "logoPosition": {
                          "default": "above",
                          "enum": [
                            "above",
                            "below",
                            "left",
                            "right"
                          ],
                          "type": "string"
                        },
                        "logoScale": {
                          "default": 1,
                          "maximum": 4,
                          "minimum": 0.25,
                          "type": "number"
                        },
                        "logoVariant": {
                          "default": "original",
                          "enum": [
                            "original",
                            "light",
                            "dark"
                          ],
                          "type": "string"
                        },
                        "margin": {
                          "default": 4,
                          "maximum": 25,
                          "minimum": 0,
                          "type": "number"
                        },
                        "opacity": {
                          "default": 45,
                          "maximum": 100,
                          "minimum": 1,
                          "type": "number"
                        },
                        "outline": {
                          "default": false,
                          "type": "boolean"
                        },
                        "pattern": {
                          "default": "signature",
                          "enum": [
                            "signature",
                            "centre",
                            "diagonal",
                            "tile"
                          ],
                          "type": "string"
                        },
                        "position": {
                          "default": "bottom-right",
                          "enum": [
                            "top-left",
                            "top-right",
                            "bottom-left",
                            "bottom-right",
                            "center"
                          ],
                          "type": "string"
                        },
                        "rotation": {
                          "default": 0,
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        },
                        "secondLine": {
                          "default": "",
                          "maxLength": 200,
                          "type": "string"
                        },
                        "size": {
                          "default": 6,
                          "maximum": 30,
                          "minimum": 1,
                          "type": "number"
                        },
                        "spacing": {
                          "default": 6,
                          "maximum": 100,
                          "minimum": 0,
                          "type": "number"
                        },
                        "text": {
                          "maxLength": 200,
                          "minLength": 1,
                          "type": "string"
                        },
                        "type": {
                          "default": "text",
                          "enum": [
                            "text",
                            "logo",
                            "both"
                          ],
                          "type": "string"
                        }
                      },
                      "required": [
                        "text"
                      ],
                      "type": "object"
                    },
                    "selectionDeadline": {
                      "format": "date-time",
                      "nullable": true,
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                      "type": "string"
                    },
                    "terms": {
                      "maxLength": 5000,
                      "type": "string"
                    },
                    "title": {
                      "maxLength": 200,
                      "minLength": 1,
                      "type": "string"
                    },
                    "turnaroundDays": {
                      "maximum": 365,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "webWatermark": {
                      "additionalProperties": false,
                      "nullable": true,
                      "properties": {
                        "alignment": {
                          "default": "center",
                          "enum": [
                            "left",
                            "center",
                            "right"
                          ],
                          "type": "string"
                        },
                        "backing": {
                          "default": false,
                          "type": "boolean"
                        },
                        "color": {
                          "default": "#ffffff",
                          "pattern": "^#[\\da-fA-F]{6}$",
                          "type": "string"
                        },
                        "font": {
                          "default": "script",
                          "enum": [
                            "script",
                            "serif",
                            "sans"
                          ],
                          "type": "string"
                        },
                        "logoAssetId": {
                          "default": null,
                          "format": "uuid",
                          "nullable": true,
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                          "type": "string"
                        },
                        "logoPosition": {
                          "default": "above",
                          "enum": [
                            "above",
                            "below",
                            "left",
                            "right"
                          ],
                          "type": "string"
                        },
                        "logoScale": {
                          "default": 1,
                          "maximum": 4,
                          "minimum": 0.25,
                          "type": "number"
                        },
                        "logoVariant": {
                          "default": "original",
                          "enum": [
                            "original",
                            "light",
                            "dark"
                          ],
                          "type": "string"
                        },
                        "margin": {
                          "default": 4,
                          "maximum": 25,
                          "minimum": 0,
                          "type": "number"
                        },
                        "opacity": {
                          "default": 45,
                          "maximum": 100,
                          "minimum": 1,
                          "type": "number"
                        },
                        "outline": {
                          "default": false,
                          "type": "boolean"
                        },
                        "pattern": {
                          "default": "signature",
                          "enum": [
                            "signature",
                            "centre",
                            "diagonal",
                            "tile"
                          ],
                          "type": "string"
                        },
                        "position": {
                          "default": "bottom-right",
                          "enum": [
                            "top-left",
                            "top-right",
                            "bottom-left",
                            "bottom-right",
                            "center"
                          ],
                          "type": "string"
                        },
                        "rotation": {
                          "default": 0,
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        },
                        "secondLine": {
                          "default": "",
                          "maxLength": 200,
                          "type": "string"
                        },
                        "size": {
                          "default": 6,
                          "maximum": 30,
                          "minimum": 1,
                          "type": "number"
                        },
                        "spacing": {
                          "default": 6,
                          "maximum": 100,
                          "minimum": 0,
                          "type": "number"
                        },
                        "text": {
                          "maxLength": 200,
                          "minLength": 1,
                          "type": "string"
                        },
                        "type": {
                          "default": "text",
                          "enum": [
                            "text",
                            "logo",
                            "both"
                          ],
                          "type": "string"
                        }
                      },
                      "required": [
                        "text"
                      ],
                      "type": "object"
                    }
                  },
                  "required": [
                    "presentation",
                    "title",
                    "mode",
                    "paymentTiming",
                    "currency",
                    "includedCount",
                    "additionalPrice",
                    "collectionPrice",
                    "bundles",
                    "terms",
                    "selectionDeadline",
                    "expiresAt",
                    "turnaroundDays",
                    "proofWatermark",
                    "webWatermark",
                    "downloadWatermark"
                  ],
                  "type": "object"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "name": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "name",
                "config"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "publication": {
            "nullable": true,
            "properties": {
              "completed": {
                "maximum": 9007199254740991,
                "minimum": -9007199254740991,
                "type": "integer"
              },
              "error": {
                "nullable": true,
                "type": "string"
              },
              "failedCaptureId": {
                "format": "uuid",
                "nullable": true,
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "id": {
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "status": {
                "enum": [
                  "queued",
                  "rendering",
                  "ready",
                  "failed"
                ],
                "type": "string"
              },
              "total": {
                "maximum": 9007199254740991,
                "minimum": -9007199254740991,
                "type": "integer"
              }
            },
            "required": [
              "id",
              "status",
              "completed",
              "total",
              "error",
              "failedCaptureId"
            ],
            "type": "object"
          },
          "receipts": {
            "items": {
              "properties": {
                "action": {
                  "type": "string"
                },
                "createdAt": {
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "orderId": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "recipientId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "reference": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "orderId",
                "recipientId",
                "action",
                "reference",
                "createdAt"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "recipients": {
            "items": {
              "properties": {
                "canDownload": {
                  "type": "boolean"
                },
                "canProof": {
                  "type": "boolean"
                },
                "captureIds": {
                  "items": {
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                    "type": "string"
                  },
                  "maxItems": 10000,
                  "nullable": true,
                  "type": "array"
                },
                "choices": {
                  "items": {
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                    "type": "string"
                  },
                  "maxItems": 10000,
                  "type": "array"
                },
                "expiresAt": {
                  "format": "date-time",
                  "nullable": true,
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "notes": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "annotations": {
                        "items": {
                          "additionalProperties": false,
                          "properties": {
                            "height": {
                              "maximum": 1,
                              "minimum": 0,
                              "type": "number"
                            },
                            "text": {
                              "maxLength": 500,
                              "type": "string"
                            },
                            "width": {
                              "maximum": 1,
                              "minimum": 0,
                              "type": "number"
                            },
                            "x": {
                              "maximum": 1,
                              "minimum": 0,
                              "type": "number"
                            },
                            "y": {
                              "maximum": 1,
                              "minimum": 0,
                              "type": "number"
                            }
                          },
                          "required": [
                            "x",
                            "y",
                            "width",
                            "height",
                            "text"
                          ],
                          "type": "object"
                        },
                        "maxItems": 20,
                        "type": "array"
                      },
                      "captureId": {
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "text": {
                        "maxLength": 2000,
                        "type": "string"
                      }
                    },
                    "required": [
                      "captureId",
                      "text"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "passwordProtected": {
                  "type": "boolean"
                },
                "revoked": {
                  "type": "boolean"
                }
              },
              "required": [
                "id",
                "name",
                "revoked",
                "expiresAt",
                "canProof",
                "canDownload",
                "captureIds",
                "choices",
                "notes",
                "passwordProtected"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "revision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "rounds": {
            "items": {
              "properties": {
                "captureIds": {
                  "items": {
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                    "type": "string"
                  },
                  "maxItems": 10000,
                  "type": "array"
                },
                "createdAt": {
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "notes": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "annotations": {
                        "items": {
                          "additionalProperties": false,
                          "properties": {
                            "height": {
                              "maximum": 1,
                              "minimum": 0,
                              "type": "number"
                            },
                            "text": {
                              "maxLength": 500,
                              "type": "string"
                            },
                            "width": {
                              "maximum": 1,
                              "minimum": 0,
                              "type": "number"
                            },
                            "x": {
                              "maximum": 1,
                              "minimum": 0,
                              "type": "number"
                            },
                            "y": {
                              "maximum": 1,
                              "minimum": 0,
                              "type": "number"
                            }
                          },
                          "required": [
                            "x",
                            "y",
                            "width",
                            "height",
                            "text"
                          ],
                          "type": "object"
                        },
                        "maxItems": 20,
                        "type": "array"
                      },
                      "captureId": {
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "text": {
                        "maxLength": 2000,
                        "type": "string"
                      }
                    },
                    "required": [
                      "captureId",
                      "text"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "number": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "type": "integer"
                },
                "recipientId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                }
              },
              "required": [
                "id",
                "recipientId",
                "number",
                "captureIds",
                "notes",
                "createdAt"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "shootId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "studioPresets": {
            "properties": {
              "presets": {
                "items": {
                  "properties": {
                    "config": {
                      "additionalProperties": false,
                      "properties": {
                        "additionalPrice": {
                          "maximum": 100000000,
                          "minimum": 0,
                          "type": "integer"
                        },
                        "bundles": {
                          "items": {
                            "additionalProperties": false,
                            "properties": {
                              "count": {
                                "maximum": 10000,
                                "minimum": 1,
                                "type": "integer"
                              },
                              "price": {
                                "maximum": 100000000,
                                "minimum": 0,
                                "type": "integer"
                              }
                            },
                            "required": [
                              "count",
                              "price"
                            ],
                            "type": "object"
                          },
                          "maxItems": 20,
                          "type": "array"
                        },
                        "collectionPrice": {
                          "maximum": 100000000,
                          "minimum": 0,
                          "nullable": true,
                          "type": "integer"
                        },
                        "currency": {
                          "pattern": "^[A-Z]{3}$",
                          "type": "string"
                        },
                        "downloadOutputs": {
                          "items": {
                            "additionalProperties": false,
                            "properties": {
                              "key": {
                                "pattern": "^[a-z][a-z0-9-]{0,39}$",
                                "type": "string"
                              },
                              "kind": {
                                "enum": [
                                  "print",
                                  "web",
                                  "social"
                                ],
                                "type": "string"
                              },
                              "label": {
                                "maxLength": 100,
                                "minLength": 1,
                                "type": "string"
                              },
                              "maxEdge": {
                                "maximum": 65535,
                                "minimum": 320,
                                "type": "integer"
                              },
                              "watermark": {
                                "additionalProperties": false,
                                "nullable": true,
                                "properties": {
                                  "alignment": {
                                    "default": "center",
                                    "enum": [
                                      "left",
                                      "center",
                                      "right"
                                    ],
                                    "type": "string"
                                  },
                                  "backing": {
                                    "default": false,
                                    "type": "boolean"
                                  },
                                  "color": {
                                    "default": "#ffffff",
                                    "pattern": "^#[\\da-fA-F]{6}$",
                                    "type": "string"
                                  },
                                  "font": {
                                    "default": "script",
                                    "enum": [
                                      "script",
                                      "serif",
                                      "sans"
                                    ],
                                    "type": "string"
                                  },
                                  "logoAssetId": {
                                    "default": null,
                                    "format": "uuid",
                                    "nullable": true,
                                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                    "type": "string"
                                  },
                                  "logoPosition": {
                                    "default": "above",
                                    "enum": [
                                      "above",
                                      "below",
                                      "left",
                                      "right"
                                    ],
                                    "type": "string"
                                  },
                                  "logoScale": {
                                    "default": 1,
                                    "maximum": 4,
                                    "minimum": 0.25,
                                    "type": "number"
                                  },
                                  "logoVariant": {
                                    "default": "original",
                                    "enum": [
                                      "original",
                                      "light",
                                      "dark"
                                    ],
                                    "type": "string"
                                  },
                                  "margin": {
                                    "default": 4,
                                    "maximum": 25,
                                    "minimum": 0,
                                    "type": "number"
                                  },
                                  "opacity": {
                                    "default": 45,
                                    "maximum": 100,
                                    "minimum": 1,
                                    "type": "number"
                                  },
                                  "outline": {
                                    "default": false,
                                    "type": "boolean"
                                  },
                                  "pattern": {
                                    "default": "signature",
                                    "enum": [
                                      "signature",
                                      "centre",
                                      "diagonal",
                                      "tile"
                                    ],
                                    "type": "string"
                                  },
                                  "position": {
                                    "default": "bottom-right",
                                    "enum": [
                                      "top-left",
                                      "top-right",
                                      "bottom-left",
                                      "bottom-right",
                                      "center"
                                    ],
                                    "type": "string"
                                  },
                                  "rotation": {
                                    "default": 0,
                                    "maximum": 180,
                                    "minimum": -180,
                                    "type": "number"
                                  },
                                  "secondLine": {
                                    "default": "",
                                    "maxLength": 200,
                                    "type": "string"
                                  },
                                  "size": {
                                    "default": 6,
                                    "maximum": 30,
                                    "minimum": 1,
                                    "type": "number"
                                  },
                                  "spacing": {
                                    "default": 6,
                                    "maximum": 100,
                                    "minimum": 0,
                                    "type": "number"
                                  },
                                  "text": {
                                    "maxLength": 200,
                                    "minLength": 1,
                                    "type": "string"
                                  },
                                  "type": {
                                    "default": "text",
                                    "enum": [
                                      "text",
                                      "logo",
                                      "both"
                                    ],
                                    "type": "string"
                                  }
                                },
                                "required": [
                                  "text"
                                ],
                                "type": "object"
                              }
                            },
                            "required": [
                              "key",
                              "label",
                              "kind",
                              "maxEdge",
                              "watermark"
                            ],
                            "type": "object"
                          },
                          "maxItems": 6,
                          "minItems": 1,
                          "type": "array"
                        },
                        "downloadWatermark": {
                          "additionalProperties": false,
                          "nullable": true,
                          "properties": {
                            "alignment": {
                              "default": "center",
                              "enum": [
                                "left",
                                "center",
                                "right"
                              ],
                              "type": "string"
                            },
                            "backing": {
                              "default": false,
                              "type": "boolean"
                            },
                            "color": {
                              "default": "#ffffff",
                              "pattern": "^#[\\da-fA-F]{6}$",
                              "type": "string"
                            },
                            "font": {
                              "default": "script",
                              "enum": [
                                "script",
                                "serif",
                                "sans"
                              ],
                              "type": "string"
                            },
                            "logoAssetId": {
                              "default": null,
                              "format": "uuid",
                              "nullable": true,
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                              "type": "string"
                            },
                            "logoPosition": {
                              "default": "above",
                              "enum": [
                                "above",
                                "below",
                                "left",
                                "right"
                              ],
                              "type": "string"
                            },
                            "logoScale": {
                              "default": 1,
                              "maximum": 4,
                              "minimum": 0.25,
                              "type": "number"
                            },
                            "logoVariant": {
                              "default": "original",
                              "enum": [
                                "original",
                                "light",
                                "dark"
                              ],
                              "type": "string"
                            },
                            "margin": {
                              "default": 4,
                              "maximum": 25,
                              "minimum": 0,
                              "type": "number"
                            },
                            "opacity": {
                              "default": 45,
                              "maximum": 100,
                              "minimum": 1,
                              "type": "number"
                            },
                            "outline": {
                              "default": false,
                              "type": "boolean"
                            },
                            "pattern": {
                              "default": "signature",
                              "enum": [
                                "signature",
                                "centre",
                                "diagonal",
                                "tile"
                              ],
                              "type": "string"
                            },
                            "position": {
                              "default": "bottom-right",
                              "enum": [
                                "top-left",
                                "top-right",
                                "bottom-left",
                                "bottom-right",
                                "center"
                              ],
                              "type": "string"
                            },
                            "rotation": {
                              "default": 0,
                              "maximum": 180,
                              "minimum": -180,
                              "type": "number"
                            },
                            "secondLine": {
                              "default": "",
                              "maxLength": 200,
                              "type": "string"
                            },
                            "size": {
                              "default": 6,
                              "maximum": 30,
                              "minimum": 1,
                              "type": "number"
                            },
                            "spacing": {
                              "default": 6,
                              "maximum": 100,
                              "minimum": 0,
                              "type": "number"
                            },
                            "text": {
                              "maxLength": 200,
                              "minLength": 1,
                              "type": "string"
                            },
                            "type": {
                              "default": "text",
                              "enum": [
                                "text",
                                "logo",
                                "both"
                              ],
                              "type": "string"
                            }
                          },
                          "required": [
                            "text"
                          ],
                          "type": "object"
                        },
                        "expiresAt": {
                          "format": "date-time",
                          "nullable": true,
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                          "type": "string"
                        },
                        "includedCount": {
                          "maximum": 10000,
                          "minimum": 0,
                          "type": "integer"
                        },
                        "mode": {
                          "enum": [
                            "edited-delivery",
                            "select-before-editing",
                            "sell-by-photo"
                          ],
                          "type": "string"
                        },
                        "paymentTiming": {
                          "enum": [
                            "before-editing",
                            "after-approval"
                          ],
                          "type": "string"
                        },
                        "presentation": {
                          "additionalProperties": false,
                          "properties": {
                            "blocks": {
                              "items": {
                                "additionalProperties": false,
                                "properties": {
                                  "captureIds": {
                                    "items": {
                                      "format": "uuid",
                                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                      "type": "string"
                                    },
                                    "maxItems": 1000,
                                    "type": "array"
                                  },
                                  "chapterId": {
                                    "format": "uuid",
                                    "nullable": true,
                                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                    "type": "string"
                                  },
                                  "id": {
                                    "format": "uuid",
                                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                    "type": "string"
                                  },
                                  "selection": {
                                    "enum": [
                                      "automatic",
                                      "explicit"
                                    ],
                                    "type": "string"
                                  },
                                  "text": {
                                    "maxLength": 2000,
                                    "type": "string"
                                  },
                                  "type": {
                                    "enum": [
                                      "chapter",
                                      "grid",
                                      "full",
                                      "pair",
                                      "caption",
                                      "slideshow"
                                    ],
                                    "type": "string"
                                  }
                                },
                                "required": [
                                  "id",
                                  "type",
                                  "chapterId",
                                  "captureIds",
                                  "text"
                                ],
                                "type": "object"
                              },
                              "maxItems": 100,
                              "type": "array"
                            },
                            "coverCaptureId": {
                              "format": "uuid",
                              "nullable": true,
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                              "type": "string"
                            },
                            "coverFocal": {
                              "maximum": 100,
                              "minimum": 0,
                              "type": "number"
                            },
                            "coverTreatment": {
                              "enum": [
                                "full",
                                "split",
                                "quiet"
                              ],
                              "type": "string"
                            },
                            "font": {
                              "enum": [
                                "editorial",
                                "modern",
                                "script"
                              ],
                              "type": "string"
                            },
                            "introduction": {
                              "maxLength": 5000,
                              "type": "string"
                            },
                            "palette": {
                              "enum": [
                                "studio",
                                "ivory",
                                "charcoal"
                              ],
                              "type": "string"
                            },
                            "showChapters": {
                              "type": "boolean"
                            },
                            "showNumbers": {
                              "type": "boolean"
                            },
                            "spacing": {
                              "enum": [
                                "compact",
                                "comfortable",
                                "airy"
                              ],
                              "type": "string"
                            },
                            "template": {
                              "enum": [
                                "wedding",
                                "portrait",
                                "fine-art",
                                "proofing"
                              ],
                              "type": "string"
                            }
                          },
                          "required": [
                            "template",
                            "coverCaptureId",
                            "coverTreatment",
                            "coverFocal",
                            "font",
                            "palette",
                            "spacing",
                            "introduction",
                            "showChapters",
                            "showNumbers"
                          ],
                          "type": "object"
                        },
                        "proofWatermark": {
                          "additionalProperties": false,
                          "properties": {
                            "alignment": {
                              "default": "center",
                              "enum": [
                                "left",
                                "center",
                                "right"
                              ],
                              "type": "string"
                            },
                            "backing": {
                              "default": false,
                              "type": "boolean"
                            },
                            "color": {
                              "default": "#ffffff",
                              "pattern": "^#[\\da-fA-F]{6}$",
                              "type": "string"
                            },
                            "font": {
                              "default": "script",
                              "enum": [
                                "script",
                                "serif",
                                "sans"
                              ],
                              "type": "string"
                            },
                            "logoAssetId": {
                              "default": null,
                              "format": "uuid",
                              "nullable": true,
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                              "type": "string"
                            },
                            "logoPosition": {
                              "default": "above",
                              "enum": [
                                "above",
                                "below",
                                "left",
                                "right"
                              ],
                              "type": "string"
                            },
                            "logoScale": {
                              "default": 1,
                              "maximum": 4,
                              "minimum": 0.25,
                              "type": "number"
                            },
                            "logoVariant": {
                              "default": "original",
                              "enum": [
                                "original",
                                "light",
                                "dark"
                              ],
                              "type": "string"
                            },
                            "margin": {
                              "default": 4,
                              "maximum": 25,
                              "minimum": 0,
                              "type": "number"
                            },
                            "opacity": {
                              "default": 45,
                              "maximum": 100,
                              "minimum": 1,
                              "type": "number"
                            },
                            "outline": {
                              "default": false,
                              "type": "boolean"
                            },
                            "pattern": {
                              "default": "signature",
                              "enum": [
                                "signature",
                                "centre",
                                "diagonal",
                                "tile"
                              ],
                              "type": "string"
                            },
                            "position": {
                              "default": "bottom-right",
                              "enum": [
                                "top-left",
                                "top-right",
                                "bottom-left",
                                "bottom-right",
                                "center"
                              ],
                              "type": "string"
                            },
                            "rotation": {
                              "default": 0,
                              "maximum": 180,
                              "minimum": -180,
                              "type": "number"
                            },
                            "secondLine": {
                              "default": "",
                              "maxLength": 200,
                              "type": "string"
                            },
                            "size": {
                              "default": 6,
                              "maximum": 30,
                              "minimum": 1,
                              "type": "number"
                            },
                            "spacing": {
                              "default": 6,
                              "maximum": 100,
                              "minimum": 0,
                              "type": "number"
                            },
                            "text": {
                              "maxLength": 200,
                              "minLength": 1,
                              "type": "string"
                            },
                            "type": {
                              "default": "text",
                              "enum": [
                                "text",
                                "logo",
                                "both"
                              ],
                              "type": "string"
                            }
                          },
                          "required": [
                            "text"
                          ],
                          "type": "object"
                        },
                        "selectionDeadline": {
                          "format": "date-time",
                          "nullable": true,
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                          "type": "string"
                        },
                        "terms": {
                          "maxLength": 5000,
                          "type": "string"
                        },
                        "title": {
                          "maxLength": 200,
                          "minLength": 1,
                          "type": "string"
                        },
                        "turnaroundDays": {
                          "maximum": 365,
                          "minimum": 0,
                          "type": "integer"
                        },
                        "webWatermark": {
                          "additionalProperties": false,
                          "nullable": true,
                          "properties": {
                            "alignment": {
                              "default": "center",
                              "enum": [
                                "left",
                                "center",
                                "right"
                              ],
                              "type": "string"
                            },
                            "backing": {
                              "default": false,
                              "type": "boolean"
                            },
                            "color": {
                              "default": "#ffffff",
                              "pattern": "^#[\\da-fA-F]{6}$",
                              "type": "string"
                            },
                            "font": {
                              "default": "script",
                              "enum": [
                                "script",
                                "serif",
                                "sans"
                              ],
                              "type": "string"
                            },
                            "logoAssetId": {
                              "default": null,
                              "format": "uuid",
                              "nullable": true,
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                              "type": "string"
                            },
                            "logoPosition": {
                              "default": "above",
                              "enum": [
                                "above",
                                "below",
                                "left",
                                "right"
                              ],
                              "type": "string"
                            },
                            "logoScale": {
                              "default": 1,
                              "maximum": 4,
                              "minimum": 0.25,
                              "type": "number"
                            },
                            "logoVariant": {
                              "default": "original",
                              "enum": [
                                "original",
                                "light",
                                "dark"
                              ],
                              "type": "string"
                            },
                            "margin": {
                              "default": 4,
                              "maximum": 25,
                              "minimum": 0,
                              "type": "number"
                            },
                            "opacity": {
                              "default": 45,
                              "maximum": 100,
                              "minimum": 1,
                              "type": "number"
                            },
                            "outline": {
                              "default": false,
                              "type": "boolean"
                            },
                            "pattern": {
                              "default": "signature",
                              "enum": [
                                "signature",
                                "centre",
                                "diagonal",
                                "tile"
                              ],
                              "type": "string"
                            },
                            "position": {
                              "default": "bottom-right",
                              "enum": [
                                "top-left",
                                "top-right",
                                "bottom-left",
                                "bottom-right",
                                "center"
                              ],
                              "type": "string"
                            },
                            "rotation": {
                              "default": 0,
                              "maximum": 180,
                              "minimum": -180,
                              "type": "number"
                            },
                            "secondLine": {
                              "default": "",
                              "maxLength": 200,
                              "type": "string"
                            },
                            "size": {
                              "default": 6,
                              "maximum": 30,
                              "minimum": 1,
                              "type": "number"
                            },
                            "spacing": {
                              "default": 6,
                              "maximum": 100,
                              "minimum": 0,
                              "type": "number"
                            },
                            "text": {
                              "maxLength": 200,
                              "minLength": 1,
                              "type": "string"
                            },
                            "type": {
                              "default": "text",
                              "enum": [
                                "text",
                                "logo",
                                "both"
                              ],
                              "type": "string"
                            }
                          },
                          "required": [
                            "text"
                          ],
                          "type": "object"
                        }
                      },
                      "required": [
                        "presentation",
                        "title",
                        "mode",
                        "paymentTiming",
                        "currency",
                        "includedCount",
                        "additionalPrice",
                        "collectionPrice",
                        "bundles",
                        "terms",
                        "selectionDeadline",
                        "expiresAt",
                        "turnaroundDays",
                        "proofWatermark",
                        "webWatermark",
                        "downloadWatermark"
                      ],
                      "type": "object"
                    },
                    "id": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "name",
                    "config"
                  ],
                  "type": "object"
                },
                "type": "array"
              },
              "revision": {
                "format": "uuid",
                "nullable": true,
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                "type": "string"
              }
            },
            "required": [
              "revision",
              "presets"
            ],
            "type": "object"
          }
        },
        "required": [
          "approvals",
          "approvedVersions",
          "captures",
          "chapters",
          "config",
          "ordering",
          "orders",
          "pendingEdits",
          "presets",
          "publication",
          "receipts",
          "recipients",
          "revision",
          "rounds",
          "shootId",
          "studioPresets"
        ],
        "type": "object"
      },
      "PhotographyApprovalDto": {
        "additionalProperties": false,
        "properties": {
          "captureId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "expectedRevision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "requestClientApproval": {
            "type": "boolean"
          },
          "revisionId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "captureId",
          "expectedRevision",
          "requestClientApproval",
          "revisionId"
        ],
        "type": "object"
      },
      "PhotographyAssemblyDto": {
        "additionalProperties": false,
        "properties": {
          "captures": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "chapterId": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "offsetSeconds": {
                  "maximum": 86400,
                  "minimum": -86400,
                  "type": "integer"
                },
                "photographer": {
                  "maxLength": 200,
                  "type": "string"
                },
                "position": {
                  "maximum": 10000,
                  "minimum": 0,
                  "type": "integer"
                },
                "withheld": {
                  "type": "boolean"
                }
              },
              "required": [
                "id",
                "chapterId",
                "position",
                "offsetSeconds",
                "photographer",
                "withheld"
              ],
              "type": "object"
            },
            "maxItems": 10000,
            "type": "array"
          },
          "chapters": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "coverCaptureId": {
                  "format": "uuid",
                  "nullable": true,
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "description": {
                  "maxLength": 2000,
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "position": {
                  "maximum": 10000,
                  "minimum": 0,
                  "type": "integer"
                },
                "title": {
                  "maxLength": 200,
                  "minLength": 1,
                  "type": "string"
                }
              },
              "required": [
                "id",
                "title",
                "description",
                "position",
                "coverCaptureId"
              ],
              "type": "object"
            },
            "maxItems": 200,
            "type": "array"
          },
          "expectedRevision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "ordering": {
            "enum": [
              "chronological",
              "photographer",
              "manual",
              "chapters"
            ],
            "type": "string"
          }
        },
        "required": [
          "captures",
          "chapters",
          "expectedRevision",
          "ordering"
        ],
        "type": "object"
      },
      "PhotographyIntakeDto": {
        "additionalProperties": false,
        "properties": {
          "expandCaptureIds": {
            "default": [],
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 10000,
            "type": "array"
          },
          "expectedRevision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          }
        },
        "required": [
          "expectedRevision"
        ],
        "type": "object"
      },
      "PhotographyOrderCreateDto": {
        "additionalProperties": false,
        "properties": {
          "bundleCount": {
            "maximum": 10000,
            "minimum": 1,
            "type": "integer"
          },
          "captureIds": {
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 10000,
            "type": "array"
          },
          "expectedRevision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "outputs": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "key": {
                  "pattern": "^[a-z][a-z0-9-]{0,39}$",
                  "type": "string"
                },
                "kind": {
                  "enum": [
                    "print",
                    "web",
                    "social"
                  ],
                  "type": "string"
                },
                "label": {
                  "maxLength": 100,
                  "minLength": 1,
                  "type": "string"
                },
                "maxEdge": {
                  "maximum": 65535,
                  "minimum": 320,
                  "type": "integer"
                },
                "revisions": {
                  "default": [],
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "captureId": {
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "revisionId": {
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      }
                    },
                    "required": [
                      "captureId",
                      "revisionId"
                    ],
                    "type": "object"
                  },
                  "maxItems": 10000,
                  "type": "array"
                },
                "watermark": {
                  "additionalProperties": false,
                  "nullable": true,
                  "properties": {
                    "alignment": {
                      "default": "center",
                      "enum": [
                        "left",
                        "center",
                        "right"
                      ],
                      "type": "string"
                    },
                    "backing": {
                      "default": false,
                      "type": "boolean"
                    },
                    "color": {
                      "default": "#ffffff",
                      "pattern": "^#[\\da-fA-F]{6}$",
                      "type": "string"
                    },
                    "font": {
                      "default": "script",
                      "enum": [
                        "script",
                        "serif",
                        "sans"
                      ],
                      "type": "string"
                    },
                    "logoAssetId": {
                      "default": null,
                      "format": "uuid",
                      "nullable": true,
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "logoPosition": {
                      "default": "above",
                      "enum": [
                        "above",
                        "below",
                        "left",
                        "right"
                      ],
                      "type": "string"
                    },
                    "logoScale": {
                      "default": 1,
                      "maximum": 4,
                      "minimum": 0.25,
                      "type": "number"
                    },
                    "logoVariant": {
                      "default": "original",
                      "enum": [
                        "original",
                        "light",
                        "dark"
                      ],
                      "type": "string"
                    },
                    "margin": {
                      "default": 4,
                      "maximum": 25,
                      "minimum": 0,
                      "type": "number"
                    },
                    "opacity": {
                      "default": 45,
                      "maximum": 100,
                      "minimum": 1,
                      "type": "number"
                    },
                    "outline": {
                      "default": false,
                      "type": "boolean"
                    },
                    "pattern": {
                      "default": "signature",
                      "enum": [
                        "signature",
                        "centre",
                        "diagonal",
                        "tile"
                      ],
                      "type": "string"
                    },
                    "position": {
                      "default": "bottom-right",
                      "enum": [
                        "top-left",
                        "top-right",
                        "bottom-left",
                        "bottom-right",
                        "center"
                      ],
                      "type": "string"
                    },
                    "rotation": {
                      "default": 0,
                      "maximum": 180,
                      "minimum": -180,
                      "type": "number"
                    },
                    "secondLine": {
                      "default": "",
                      "maxLength": 200,
                      "type": "string"
                    },
                    "size": {
                      "default": 6,
                      "maximum": 30,
                      "minimum": 1,
                      "type": "number"
                    },
                    "spacing": {
                      "default": 6,
                      "maximum": 100,
                      "minimum": 0,
                      "type": "number"
                    },
                    "text": {
                      "maxLength": 200,
                      "minLength": 1,
                      "type": "string"
                    },
                    "type": {
                      "default": "text",
                      "enum": [
                        "text",
                        "logo",
                        "both"
                      ],
                      "type": "string"
                    }
                  },
                  "required": [
                    "text"
                  ],
                  "type": "object"
                }
              },
              "required": [
                "key",
                "label",
                "kind",
                "maxEdge",
                "watermark"
              ],
              "type": "object"
            },
            "maxItems": 6,
            "minItems": 1,
            "type": "array"
          },
          "pricing": {
            "enum": [
              "package",
              "collection",
              "bundle"
            ],
            "type": "string"
          },
          "recipientId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "roundId": {
            "default": null,
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "expectedRevision",
          "pricing",
          "recipientId"
        ],
        "type": "object"
      },
      "PhotographyPaymentDto": {
        "additionalProperties": false,
        "properties": {
          "action": {
            "enum": [
              "settle",
              "refund",
              "cancel"
            ],
            "type": "string"
          },
          "expectedRevision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "reference": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "action",
          "expectedRevision",
          "reference"
        ],
        "type": "object"
      },
      "PhotographyPublicationDto": {
        "additionalProperties": false,
        "properties": {
          "expectedRevision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "scope": {
            "enum": [
              "all-eligible",
              "selected"
            ],
            "type": "string"
          }
        },
        "required": [
          "expectedRevision",
          "scope"
        ],
        "type": "object"
      },
      "PhotographyInvitationDto": {
        "properties": {
          "invitation": {
            "properties": {
              "recipientId": {
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "token": {
                "type": "string"
              }
            },
            "required": [
              "recipientId",
              "token"
            ],
            "type": "object"
          },
          "workflow": {
            "properties": {
              "approvals": {
                "items": {
                  "properties": {
                    "approved": {
                      "type": "boolean"
                    },
                    "captureId": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "createdAt": {
                      "type": "string"
                    },
                    "note": {
                      "type": "string"
                    },
                    "recipientId": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "revisionId": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    }
                  },
                  "required": [
                    "recipientId",
                    "captureId",
                    "revisionId",
                    "approved",
                    "note",
                    "createdAt"
                  ],
                  "type": "object"
                },
                "type": "array"
              },
              "approvedVersions": {
                "items": {
                  "properties": {
                    "approvedAt": {
                      "type": "string"
                    },
                    "captureId": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "revisionId": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    }
                  },
                  "required": [
                    "captureId",
                    "revisionId",
                    "approvedAt"
                  ],
                  "type": "object"
                },
                "type": "array"
              },
              "captures": {
                "items": {
                  "properties": {
                    "approvalRequested": {
                      "type": "boolean"
                    },
                    "approvedRevisionId": {
                      "format": "uuid",
                      "nullable": true,
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "assetId": {
                      "format": "uuid",
                      "nullable": true,
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "assetIds": {
                      "items": {
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "maxItems": 10000,
                      "type": "array"
                    },
                    "camera": {
                      "nullable": true,
                      "type": "string"
                    },
                    "capturedAt": {
                      "nullable": true,
                      "type": "string"
                    },
                    "chapterId": {
                      "format": "uuid",
                      "nullable": true,
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "checksum": {
                      "nullable": true,
                      "type": "string"
                    },
                    "eligible": {
                      "type": "boolean"
                    },
                    "exclusion": {
                      "nullable": true,
                      "type": "string"
                    },
                    "fileName": {
                      "nullable": true,
                      "type": "string"
                    },
                    "id": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "isRaw": {
                      "nullable": true,
                      "type": "boolean"
                    },
                    "number": {
                      "maximum": 9007199254740991,
                      "minimum": -9007199254740991,
                      "type": "integer"
                    },
                    "offsetSeconds": {
                      "maximum": 9007199254740991,
                      "minimum": -9007199254740991,
                      "type": "integer"
                    },
                    "photographer": {
                      "type": "string"
                    },
                    "position": {
                      "maximum": 9007199254740991,
                      "minimum": -9007199254740991,
                      "type": "integer"
                    },
                    "processing": {
                      "enum": [
                        "ready",
                        "pending",
                        "failed"
                      ],
                      "type": "string"
                    },
                    "proofRevisionId": {
                      "format": "uuid",
                      "nullable": true,
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "rating": {
                      "maximum": 9007199254740991,
                      "minimum": -9007199254740991,
                      "nullable": true,
                      "type": "integer"
                    },
                    "state": {
                      "enum": [
                        "imported",
                        "selected",
                        "approval-requested",
                        "approved",
                        "delivered"
                      ],
                      "type": "string"
                    },
                    "withheld": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "id",
                    "number",
                    "assetId",
                    "assetIds",
                    "checksum",
                    "fileName",
                    "camera",
                    "capturedAt",
                    "offsetSeconds",
                    "photographer",
                    "chapterId",
                    "position",
                    "withheld",
                    "rating",
                    "isRaw",
                    "eligible",
                    "exclusion",
                    "processing",
                    "proofRevisionId",
                    "approvedRevisionId",
                    "approvalRequested",
                    "state"
                  ],
                  "type": "object"
                },
                "type": "array"
              },
              "chapters": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "coverCaptureId": {
                      "format": "uuid",
                      "nullable": true,
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "description": {
                      "maxLength": 2000,
                      "type": "string"
                    },
                    "id": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "position": {
                      "maximum": 10000,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "title": {
                      "maxLength": 200,
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "title",
                    "description",
                    "position",
                    "coverCaptureId"
                  ],
                  "type": "object"
                },
                "type": "array"
              },
              "config": {
                "additionalProperties": false,
                "properties": {
                  "additionalPrice": {
                    "maximum": 100000000,
                    "minimum": 0,
                    "type": "integer"
                  },
                  "bundles": {
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "count": {
                          "maximum": 10000,
                          "minimum": 1,
                          "type": "integer"
                        },
                        "price": {
                          "maximum": 100000000,
                          "minimum": 0,
                          "type": "integer"
                        }
                      },
                      "required": [
                        "count",
                        "price"
                      ],
                      "type": "object"
                    },
                    "maxItems": 20,
                    "type": "array"
                  },
                  "collectionPrice": {
                    "maximum": 100000000,
                    "minimum": 0,
                    "nullable": true,
                    "type": "integer"
                  },
                  "currency": {
                    "pattern": "^[A-Z]{3}$",
                    "type": "string"
                  },
                  "downloadOutputs": {
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "key": {
                          "pattern": "^[a-z][a-z0-9-]{0,39}$",
                          "type": "string"
                        },
                        "kind": {
                          "enum": [
                            "print",
                            "web",
                            "social"
                          ],
                          "type": "string"
                        },
                        "label": {
                          "maxLength": 100,
                          "minLength": 1,
                          "type": "string"
                        },
                        "maxEdge": {
                          "maximum": 65535,
                          "minimum": 320,
                          "type": "integer"
                        },
                        "watermark": {
                          "additionalProperties": false,
                          "nullable": true,
                          "properties": {
                            "alignment": {
                              "default": "center",
                              "enum": [
                                "left",
                                "center",
                                "right"
                              ],
                              "type": "string"
                            },
                            "backing": {
                              "default": false,
                              "type": "boolean"
                            },
                            "color": {
                              "default": "#ffffff",
                              "pattern": "^#[\\da-fA-F]{6}$",
                              "type": "string"
                            },
                            "font": {
                              "default": "script",
                              "enum": [
                                "script",
                                "serif",
                                "sans"
                              ],
                              "type": "string"
                            },
                            "logoAssetId": {
                              "default": null,
                              "format": "uuid",
                              "nullable": true,
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                              "type": "string"
                            },
                            "logoPosition": {
                              "default": "above",
                              "enum": [
                                "above",
                                "below",
                                "left",
                                "right"
                              ],
                              "type": "string"
                            },
                            "logoScale": {
                              "default": 1,
                              "maximum": 4,
                              "minimum": 0.25,
                              "type": "number"
                            },
                            "logoVariant": {
                              "default": "original",
                              "enum": [
                                "original",
                                "light",
                                "dark"
                              ],
                              "type": "string"
                            },
                            "margin": {
                              "default": 4,
                              "maximum": 25,
                              "minimum": 0,
                              "type": "number"
                            },
                            "opacity": {
                              "default": 45,
                              "maximum": 100,
                              "minimum": 1,
                              "type": "number"
                            },
                            "outline": {
                              "default": false,
                              "type": "boolean"
                            },
                            "pattern": {
                              "default": "signature",
                              "enum": [
                                "signature",
                                "centre",
                                "diagonal",
                                "tile"
                              ],
                              "type": "string"
                            },
                            "position": {
                              "default": "bottom-right",
                              "enum": [
                                "top-left",
                                "top-right",
                                "bottom-left",
                                "bottom-right",
                                "center"
                              ],
                              "type": "string"
                            },
                            "rotation": {
                              "default": 0,
                              "maximum": 180,
                              "minimum": -180,
                              "type": "number"
                            },
                            "secondLine": {
                              "default": "",
                              "maxLength": 200,
                              "type": "string"
                            },
                            "size": {
                              "default": 6,
                              "maximum": 30,
                              "minimum": 1,
                              "type": "number"
                            },
                            "spacing": {
                              "default": 6,
                              "maximum": 100,
                              "minimum": 0,
                              "type": "number"
                            },
                            "text": {
                              "maxLength": 200,
                              "minLength": 1,
                              "type": "string"
                            },
                            "type": {
                              "default": "text",
                              "enum": [
                                "text",
                                "logo",
                                "both"
                              ],
                              "type": "string"
                            }
                          },
                          "required": [
                            "text"
                          ],
                          "type": "object"
                        }
                      },
                      "required": [
                        "key",
                        "label",
                        "kind",
                        "maxEdge",
                        "watermark"
                      ],
                      "type": "object"
                    },
                    "maxItems": 6,
                    "minItems": 1,
                    "type": "array"
                  },
                  "downloadWatermark": {
                    "additionalProperties": false,
                    "nullable": true,
                    "properties": {
                      "alignment": {
                        "default": "center",
                        "enum": [
                          "left",
                          "center",
                          "right"
                        ],
                        "type": "string"
                      },
                      "backing": {
                        "default": false,
                        "type": "boolean"
                      },
                      "color": {
                        "default": "#ffffff",
                        "pattern": "^#[\\da-fA-F]{6}$",
                        "type": "string"
                      },
                      "font": {
                        "default": "script",
                        "enum": [
                          "script",
                          "serif",
                          "sans"
                        ],
                        "type": "string"
                      },
                      "logoAssetId": {
                        "default": null,
                        "format": "uuid",
                        "nullable": true,
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "logoPosition": {
                        "default": "above",
                        "enum": [
                          "above",
                          "below",
                          "left",
                          "right"
                        ],
                        "type": "string"
                      },
                      "logoScale": {
                        "default": 1,
                        "maximum": 4,
                        "minimum": 0.25,
                        "type": "number"
                      },
                      "logoVariant": {
                        "default": "original",
                        "enum": [
                          "original",
                          "light",
                          "dark"
                        ],
                        "type": "string"
                      },
                      "margin": {
                        "default": 4,
                        "maximum": 25,
                        "minimum": 0,
                        "type": "number"
                      },
                      "opacity": {
                        "default": 45,
                        "maximum": 100,
                        "minimum": 1,
                        "type": "number"
                      },
                      "outline": {
                        "default": false,
                        "type": "boolean"
                      },
                      "pattern": {
                        "default": "signature",
                        "enum": [
                          "signature",
                          "centre",
                          "diagonal",
                          "tile"
                        ],
                        "type": "string"
                      },
                      "position": {
                        "default": "bottom-right",
                        "enum": [
                          "top-left",
                          "top-right",
                          "bottom-left",
                          "bottom-right",
                          "center"
                        ],
                        "type": "string"
                      },
                      "rotation": {
                        "default": 0,
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      },
                      "secondLine": {
                        "default": "",
                        "maxLength": 200,
                        "type": "string"
                      },
                      "size": {
                        "default": 6,
                        "maximum": 30,
                        "minimum": 1,
                        "type": "number"
                      },
                      "spacing": {
                        "default": 6,
                        "maximum": 100,
                        "minimum": 0,
                        "type": "number"
                      },
                      "text": {
                        "maxLength": 200,
                        "minLength": 1,
                        "type": "string"
                      },
                      "type": {
                        "default": "text",
                        "enum": [
                          "text",
                          "logo",
                          "both"
                        ],
                        "type": "string"
                      }
                    },
                    "required": [
                      "text"
                    ],
                    "type": "object"
                  },
                  "expiresAt": {
                    "format": "date-time",
                    "nullable": true,
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                    "type": "string"
                  },
                  "includedCount": {
                    "maximum": 10000,
                    "minimum": 0,
                    "type": "integer"
                  },
                  "mode": {
                    "enum": [
                      "edited-delivery",
                      "select-before-editing",
                      "sell-by-photo"
                    ],
                    "type": "string"
                  },
                  "paymentTiming": {
                    "enum": [
                      "before-editing",
                      "after-approval"
                    ],
                    "type": "string"
                  },
                  "presentation": {
                    "additionalProperties": false,
                    "properties": {
                      "blocks": {
                        "items": {
                          "additionalProperties": false,
                          "properties": {
                            "captureIds": {
                              "items": {
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                "type": "string"
                              },
                              "maxItems": 1000,
                              "type": "array"
                            },
                            "chapterId": {
                              "format": "uuid",
                              "nullable": true,
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                              "type": "string"
                            },
                            "id": {
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                              "type": "string"
                            },
                            "selection": {
                              "enum": [
                                "automatic",
                                "explicit"
                              ],
                              "type": "string"
                            },
                            "text": {
                              "maxLength": 2000,
                              "type": "string"
                            },
                            "type": {
                              "enum": [
                                "chapter",
                                "grid",
                                "full",
                                "pair",
                                "caption",
                                "slideshow"
                              ],
                              "type": "string"
                            }
                          },
                          "required": [
                            "id",
                            "type",
                            "chapterId",
                            "captureIds",
                            "text"
                          ],
                          "type": "object"
                        },
                        "maxItems": 100,
                        "type": "array"
                      },
                      "coverCaptureId": {
                        "format": "uuid",
                        "nullable": true,
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "coverFocal": {
                        "maximum": 100,
                        "minimum": 0,
                        "type": "number"
                      },
                      "coverTreatment": {
                        "enum": [
                          "full",
                          "split",
                          "quiet"
                        ],
                        "type": "string"
                      },
                      "font": {
                        "enum": [
                          "editorial",
                          "modern",
                          "script"
                        ],
                        "type": "string"
                      },
                      "introduction": {
                        "maxLength": 5000,
                        "type": "string"
                      },
                      "palette": {
                        "enum": [
                          "studio",
                          "ivory",
                          "charcoal"
                        ],
                        "type": "string"
                      },
                      "showChapters": {
                        "type": "boolean"
                      },
                      "showNumbers": {
                        "type": "boolean"
                      },
                      "spacing": {
                        "enum": [
                          "compact",
                          "comfortable",
                          "airy"
                        ],
                        "type": "string"
                      },
                      "template": {
                        "enum": [
                          "wedding",
                          "portrait",
                          "fine-art",
                          "proofing"
                        ],
                        "type": "string"
                      }
                    },
                    "required": [
                      "template",
                      "coverCaptureId",
                      "coverTreatment",
                      "coverFocal",
                      "font",
                      "palette",
                      "spacing",
                      "introduction",
                      "showChapters",
                      "showNumbers"
                    ],
                    "type": "object"
                  },
                  "proofWatermark": {
                    "additionalProperties": false,
                    "properties": {
                      "alignment": {
                        "default": "center",
                        "enum": [
                          "left",
                          "center",
                          "right"
                        ],
                        "type": "string"
                      },
                      "backing": {
                        "default": false,
                        "type": "boolean"
                      },
                      "color": {
                        "default": "#ffffff",
                        "pattern": "^#[\\da-fA-F]{6}$",
                        "type": "string"
                      },
                      "font": {
                        "default": "script",
                        "enum": [
                          "script",
                          "serif",
                          "sans"
                        ],
                        "type": "string"
                      },
                      "logoAssetId": {
                        "default": null,
                        "format": "uuid",
                        "nullable": true,
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "logoPosition": {
                        "default": "above",
                        "enum": [
                          "above",
                          "below",
                          "left",
                          "right"
                        ],
                        "type": "string"
                      },
                      "logoScale": {
                        "default": 1,
                        "maximum": 4,
                        "minimum": 0.25,
                        "type": "number"
                      },
                      "logoVariant": {
                        "default": "original",
                        "enum": [
                          "original",
                          "light",
                          "dark"
                        ],
                        "type": "string"
                      },
                      "margin": {
                        "default": 4,
                        "maximum": 25,
                        "minimum": 0,
                        "type": "number"
                      },
                      "opacity": {
                        "default": 45,
                        "maximum": 100,
                        "minimum": 1,
                        "type": "number"
                      },
                      "outline": {
                        "default": false,
                        "type": "boolean"
                      },
                      "pattern": {
                        "default": "signature",
                        "enum": [
                          "signature",
                          "centre",
                          "diagonal",
                          "tile"
                        ],
                        "type": "string"
                      },
                      "position": {
                        "default": "bottom-right",
                        "enum": [
                          "top-left",
                          "top-right",
                          "bottom-left",
                          "bottom-right",
                          "center"
                        ],
                        "type": "string"
                      },
                      "rotation": {
                        "default": 0,
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      },
                      "secondLine": {
                        "default": "",
                        "maxLength": 200,
                        "type": "string"
                      },
                      "size": {
                        "default": 6,
                        "maximum": 30,
                        "minimum": 1,
                        "type": "number"
                      },
                      "spacing": {
                        "default": 6,
                        "maximum": 100,
                        "minimum": 0,
                        "type": "number"
                      },
                      "text": {
                        "maxLength": 200,
                        "minLength": 1,
                        "type": "string"
                      },
                      "type": {
                        "default": "text",
                        "enum": [
                          "text",
                          "logo",
                          "both"
                        ],
                        "type": "string"
                      }
                    },
                    "required": [
                      "text"
                    ],
                    "type": "object"
                  },
                  "selectionDeadline": {
                    "format": "date-time",
                    "nullable": true,
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                    "type": "string"
                  },
                  "terms": {
                    "maxLength": 5000,
                    "type": "string"
                  },
                  "title": {
                    "maxLength": 200,
                    "minLength": 1,
                    "type": "string"
                  },
                  "turnaroundDays": {
                    "maximum": 365,
                    "minimum": 0,
                    "type": "integer"
                  },
                  "webWatermark": {
                    "additionalProperties": false,
                    "nullable": true,
                    "properties": {
                      "alignment": {
                        "default": "center",
                        "enum": [
                          "left",
                          "center",
                          "right"
                        ],
                        "type": "string"
                      },
                      "backing": {
                        "default": false,
                        "type": "boolean"
                      },
                      "color": {
                        "default": "#ffffff",
                        "pattern": "^#[\\da-fA-F]{6}$",
                        "type": "string"
                      },
                      "font": {
                        "default": "script",
                        "enum": [
                          "script",
                          "serif",
                          "sans"
                        ],
                        "type": "string"
                      },
                      "logoAssetId": {
                        "default": null,
                        "format": "uuid",
                        "nullable": true,
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "logoPosition": {
                        "default": "above",
                        "enum": [
                          "above",
                          "below",
                          "left",
                          "right"
                        ],
                        "type": "string"
                      },
                      "logoScale": {
                        "default": 1,
                        "maximum": 4,
                        "minimum": 0.25,
                        "type": "number"
                      },
                      "logoVariant": {
                        "default": "original",
                        "enum": [
                          "original",
                          "light",
                          "dark"
                        ],
                        "type": "string"
                      },
                      "margin": {
                        "default": 4,
                        "maximum": 25,
                        "minimum": 0,
                        "type": "number"
                      },
                      "opacity": {
                        "default": 45,
                        "maximum": 100,
                        "minimum": 1,
                        "type": "number"
                      },
                      "outline": {
                        "default": false,
                        "type": "boolean"
                      },
                      "pattern": {
                        "default": "signature",
                        "enum": [
                          "signature",
                          "centre",
                          "diagonal",
                          "tile"
                        ],
                        "type": "string"
                      },
                      "position": {
                        "default": "bottom-right",
                        "enum": [
                          "top-left",
                          "top-right",
                          "bottom-left",
                          "bottom-right",
                          "center"
                        ],
                        "type": "string"
                      },
                      "rotation": {
                        "default": 0,
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      },
                      "secondLine": {
                        "default": "",
                        "maxLength": 200,
                        "type": "string"
                      },
                      "size": {
                        "default": 6,
                        "maximum": 30,
                        "minimum": 1,
                        "type": "number"
                      },
                      "spacing": {
                        "default": 6,
                        "maximum": 100,
                        "minimum": 0,
                        "type": "number"
                      },
                      "text": {
                        "maxLength": 200,
                        "minLength": 1,
                        "type": "string"
                      },
                      "type": {
                        "default": "text",
                        "enum": [
                          "text",
                          "logo",
                          "both"
                        ],
                        "type": "string"
                      }
                    },
                    "required": [
                      "text"
                    ],
                    "type": "object"
                  }
                },
                "required": [
                  "presentation",
                  "title",
                  "mode",
                  "paymentTiming",
                  "currency",
                  "includedCount",
                  "additionalPrice",
                  "collectionPrice",
                  "bundles",
                  "terms",
                  "selectionDeadline",
                  "expiresAt",
                  "turnaroundDays",
                  "proofWatermark",
                  "webWatermark",
                  "downloadWatermark"
                ],
                "type": "object"
              },
              "ordering": {
                "enum": [
                  "chronological",
                  "photographer",
                  "manual",
                  "chapters"
                ],
                "type": "string"
              },
              "orders": {
                "items": {
                  "properties": {
                    "acceptedAt": {
                      "nullable": true,
                      "type": "string"
                    },
                    "captureIds": {
                      "items": {
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "maxItems": 10000,
                      "type": "array"
                    },
                    "createdAt": {
                      "type": "string"
                    },
                    "currency": {
                      "type": "string"
                    },
                    "editingBlocked": {
                      "type": "boolean"
                    },
                    "id": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "items": {
                      "items": {
                        "properties": {
                          "approved": {
                            "type": "boolean"
                          },
                          "captureId": {
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                            "type": "string"
                          },
                          "clientApprovalRequired": {
                            "type": "boolean"
                          },
                          "exportSpec": {
                            "properties": {
                              "format": {
                                "enum": [
                                  "jpeg"
                                ],
                                "type": "string"
                              },
                              "maxEdge": {
                                "maximum": 65535,
                                "minimum": 320,
                                "type": "integer"
                              },
                              "quality": {
                                "enum": [
                                  90
                                ],
                                "type": "number"
                              }
                            },
                            "required": [
                              "format",
                              "quality",
                              "maxEdge"
                            ],
                            "type": "object"
                          },
                          "outputs": {
                            "items": {
                              "properties": {
                                "approvalPreviewUrl": {
                                  "nullable": true,
                                  "type": "string"
                                },
                                "approved": {
                                  "type": "boolean"
                                },
                                "blockedReason": {
                                  "enum": [
                                    "permission",
                                    "order",
                                    "payment",
                                    "approval",
                                    "render"
                                  ],
                                  "nullable": true,
                                  "type": "string"
                                },
                                "branded": {
                                  "type": "boolean"
                                },
                                "canDownload": {
                                  "type": "boolean"
                                },
                                "clientApprovalRequired": {
                                  "type": "boolean"
                                },
                                "exportSpec": {
                                  "properties": {
                                    "format": {
                                      "enum": [
                                        "jpeg"
                                      ],
                                      "type": "string"
                                    },
                                    "maxEdge": {
                                      "maximum": 65535,
                                      "minimum": 320,
                                      "type": "integer"
                                    },
                                    "quality": {
                                      "enum": [
                                        90
                                      ],
                                      "type": "number"
                                    }
                                  },
                                  "required": [
                                    "format",
                                    "quality",
                                    "maxEdge"
                                  ],
                                  "type": "object"
                                },
                                "id": {
                                  "format": "uuid",
                                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                  "type": "string"
                                },
                                "kind": {
                                  "enum": [
                                    "print",
                                    "web",
                                    "social"
                                  ],
                                  "type": "string"
                                },
                                "label": {
                                  "type": "string"
                                },
                                "ready": {
                                  "type": "boolean"
                                },
                                "renderStatus": {
                                  "enum": [
                                    "awaiting-approval",
                                    "preparing",
                                    "ready"
                                  ],
                                  "type": "string"
                                },
                                "revisionId": {
                                  "format": "uuid",
                                  "nullable": true,
                                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                  "type": "string"
                                },
                                "url": {
                                  "type": "string"
                                }
                              },
                              "required": [
                                "id",
                                "label",
                                "kind",
                                "revisionId",
                                "approved",
                                "clientApprovalRequired",
                                "ready",
                                "renderStatus",
                                "branded",
                                "approvalPreviewUrl",
                                "exportSpec",
                                "url"
                              ],
                              "type": "object"
                            },
                            "type": "array"
                          },
                          "ready": {
                            "type": "boolean"
                          },
                          "revisionId": {
                            "format": "uuid",
                            "nullable": true,
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                            "type": "string"
                          }
                        },
                        "required": [
                          "captureId",
                          "revisionId",
                          "approved",
                          "clientApprovalRequired",
                          "ready",
                          "exportSpec",
                          "outputs"
                        ],
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "paymentTiming": {
                      "enum": [
                        "before-editing",
                        "after-approval"
                      ],
                      "type": "string"
                    },
                    "pricing": {
                      "properties": {
                        "additionalPrice": {
                          "maximum": 100000000,
                          "minimum": 0,
                          "type": "integer"
                        },
                        "bundles": {
                          "items": {
                            "additionalProperties": false,
                            "properties": {
                              "count": {
                                "maximum": 10000,
                                "minimum": 1,
                                "type": "integer"
                              },
                              "price": {
                                "maximum": 100000000,
                                "minimum": 0,
                                "type": "integer"
                              }
                            },
                            "required": [
                              "count",
                              "price"
                            ],
                            "type": "object"
                          },
                          "maxItems": 20,
                          "type": "array"
                        },
                        "collectionPrice": {
                          "maximum": 100000000,
                          "minimum": 0,
                          "nullable": true,
                          "type": "integer"
                        },
                        "includedCount": {
                          "maximum": 9007199254740991,
                          "minimum": -9007199254740991,
                          "type": "integer"
                        },
                        "option": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "includedCount",
                        "additionalPrice",
                        "collectionPrice",
                        "bundles",
                        "option"
                      ],
                      "type": "object"
                    },
                    "readyCount": {
                      "maximum": 9007199254740991,
                      "minimum": -9007199254740991,
                      "type": "integer"
                    },
                    "recipientId": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "roundId": {
                      "format": "uuid",
                      "nullable": true,
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "status": {
                      "enum": [
                        "quoted",
                        "accepted",
                        "settled",
                        "free",
                        "refunded",
                        "cancelled"
                      ],
                      "type": "string"
                    },
                    "terms": {
                      "type": "string"
                    },
                    "total": {
                      "maximum": 100000000,
                      "minimum": 0,
                      "type": "integer"
                    }
                  },
                  "required": [
                    "id",
                    "recipientId",
                    "roundId",
                    "status",
                    "currency",
                    "total",
                    "captureIds",
                    "terms",
                    "paymentTiming",
                    "pricing",
                    "createdAt",
                    "acceptedAt",
                    "items",
                    "readyCount",
                    "editingBlocked"
                  ],
                  "type": "object"
                },
                "type": "array"
              },
              "pendingEdits": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "presets": {
                "items": {
                  "properties": {
                    "config": {
                      "additionalProperties": false,
                      "properties": {
                        "additionalPrice": {
                          "maximum": 100000000,
                          "minimum": 0,
                          "type": "integer"
                        },
                        "bundles": {
                          "items": {
                            "additionalProperties": false,
                            "properties": {
                              "count": {
                                "maximum": 10000,
                                "minimum": 1,
                                "type": "integer"
                              },
                              "price": {
                                "maximum": 100000000,
                                "minimum": 0,
                                "type": "integer"
                              }
                            },
                            "required": [
                              "count",
                              "price"
                            ],
                            "type": "object"
                          },
                          "maxItems": 20,
                          "type": "array"
                        },
                        "collectionPrice": {
                          "maximum": 100000000,
                          "minimum": 0,
                          "nullable": true,
                          "type": "integer"
                        },
                        "currency": {
                          "pattern": "^[A-Z]{3}$",
                          "type": "string"
                        },
                        "downloadOutputs": {
                          "items": {
                            "additionalProperties": false,
                            "properties": {
                              "key": {
                                "pattern": "^[a-z][a-z0-9-]{0,39}$",
                                "type": "string"
                              },
                              "kind": {
                                "enum": [
                                  "print",
                                  "web",
                                  "social"
                                ],
                                "type": "string"
                              },
                              "label": {
                                "maxLength": 100,
                                "minLength": 1,
                                "type": "string"
                              },
                              "maxEdge": {
                                "maximum": 65535,
                                "minimum": 320,
                                "type": "integer"
                              },
                              "watermark": {
                                "additionalProperties": false,
                                "nullable": true,
                                "properties": {
                                  "alignment": {
                                    "default": "center",
                                    "enum": [
                                      "left",
                                      "center",
                                      "right"
                                    ],
                                    "type": "string"
                                  },
                                  "backing": {
                                    "default": false,
                                    "type": "boolean"
                                  },
                                  "color": {
                                    "default": "#ffffff",
                                    "pattern": "^#[\\da-fA-F]{6}$",
                                    "type": "string"
                                  },
                                  "font": {
                                    "default": "script",
                                    "enum": [
                                      "script",
                                      "serif",
                                      "sans"
                                    ],
                                    "type": "string"
                                  },
                                  "logoAssetId": {
                                    "default": null,
                                    "format": "uuid",
                                    "nullable": true,
                                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                    "type": "string"
                                  },
                                  "logoPosition": {
                                    "default": "above",
                                    "enum": [
                                      "above",
                                      "below",
                                      "left",
                                      "right"
                                    ],
                                    "type": "string"
                                  },
                                  "logoScale": {
                                    "default": 1,
                                    "maximum": 4,
                                    "minimum": 0.25,
                                    "type": "number"
                                  },
                                  "logoVariant": {
                                    "default": "original",
                                    "enum": [
                                      "original",
                                      "light",
                                      "dark"
                                    ],
                                    "type": "string"
                                  },
                                  "margin": {
                                    "default": 4,
                                    "maximum": 25,
                                    "minimum": 0,
                                    "type": "number"
                                  },
                                  "opacity": {
                                    "default": 45,
                                    "maximum": 100,
                                    "minimum": 1,
                                    "type": "number"
                                  },
                                  "outline": {
                                    "default": false,
                                    "type": "boolean"
                                  },
                                  "pattern": {
                                    "default": "signature",
                                    "enum": [
                                      "signature",
                                      "centre",
                                      "diagonal",
                                      "tile"
                                    ],
                                    "type": "string"
                                  },
                                  "position": {
                                    "default": "bottom-right",
                                    "enum": [
                                      "top-left",
                                      "top-right",
                                      "bottom-left",
                                      "bottom-right",
                                      "center"
                                    ],
                                    "type": "string"
                                  },
                                  "rotation": {
                                    "default": 0,
                                    "maximum": 180,
                                    "minimum": -180,
                                    "type": "number"
                                  },
                                  "secondLine": {
                                    "default": "",
                                    "maxLength": 200,
                                    "type": "string"
                                  },
                                  "size": {
                                    "default": 6,
                                    "maximum": 30,
                                    "minimum": 1,
                                    "type": "number"
                                  },
                                  "spacing": {
                                    "default": 6,
                                    "maximum": 100,
                                    "minimum": 0,
                                    "type": "number"
                                  },
                                  "text": {
                                    "maxLength": 200,
                                    "minLength": 1,
                                    "type": "string"
                                  },
                                  "type": {
                                    "default": "text",
                                    "enum": [
                                      "text",
                                      "logo",
                                      "both"
                                    ],
                                    "type": "string"
                                  }
                                },
                                "required": [
                                  "text"
                                ],
                                "type": "object"
                              }
                            },
                            "required": [
                              "key",
                              "label",
                              "kind",
                              "maxEdge",
                              "watermark"
                            ],
                            "type": "object"
                          },
                          "maxItems": 6,
                          "minItems": 1,
                          "type": "array"
                        },
                        "downloadWatermark": {
                          "additionalProperties": false,
                          "nullable": true,
                          "properties": {
                            "alignment": {
                              "default": "center",
                              "enum": [
                                "left",
                                "center",
                                "right"
                              ],
                              "type": "string"
                            },
                            "backing": {
                              "default": false,
                              "type": "boolean"
                            },
                            "color": {
                              "default": "#ffffff",
                              "pattern": "^#[\\da-fA-F]{6}$",
                              "type": "string"
                            },
                            "font": {
                              "default": "script",
                              "enum": [
                                "script",
                                "serif",
                                "sans"
                              ],
                              "type": "string"
                            },
                            "logoAssetId": {
                              "default": null,
                              "format": "uuid",
                              "nullable": true,
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                              "type": "string"
                            },
                            "logoPosition": {
                              "default": "above",
                              "enum": [
                                "above",
                                "below",
                                "left",
                                "right"
                              ],
                              "type": "string"
                            },
                            "logoScale": {
                              "default": 1,
                              "maximum": 4,
                              "minimum": 0.25,
                              "type": "number"
                            },
                            "logoVariant": {
                              "default": "original",
                              "enum": [
                                "original",
                                "light",
                                "dark"
                              ],
                              "type": "string"
                            },
                            "margin": {
                              "default": 4,
                              "maximum": 25,
                              "minimum": 0,
                              "type": "number"
                            },
                            "opacity": {
                              "default": 45,
                              "maximum": 100,
                              "minimum": 1,
                              "type": "number"
                            },
                            "outline": {
                              "default": false,
                              "type": "boolean"
                            },
                            "pattern": {
                              "default": "signature",
                              "enum": [
                                "signature",
                                "centre",
                                "diagonal",
                                "tile"
                              ],
                              "type": "string"
                            },
                            "position": {
                              "default": "bottom-right",
                              "enum": [
                                "top-left",
                                "top-right",
                                "bottom-left",
                                "bottom-right",
                                "center"
                              ],
                              "type": "string"
                            },
                            "rotation": {
                              "default": 0,
                              "maximum": 180,
                              "minimum": -180,
                              "type": "number"
                            },
                            "secondLine": {
                              "default": "",
                              "maxLength": 200,
                              "type": "string"
                            },
                            "size": {
                              "default": 6,
                              "maximum": 30,
                              "minimum": 1,
                              "type": "number"
                            },
                            "spacing": {
                              "default": 6,
                              "maximum": 100,
                              "minimum": 0,
                              "type": "number"
                            },
                            "text": {
                              "maxLength": 200,
                              "minLength": 1,
                              "type": "string"
                            },
                            "type": {
                              "default": "text",
                              "enum": [
                                "text",
                                "logo",
                                "both"
                              ],
                              "type": "string"
                            }
                          },
                          "required": [
                            "text"
                          ],
                          "type": "object"
                        },
                        "expiresAt": {
                          "format": "date-time",
                          "nullable": true,
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                          "type": "string"
                        },
                        "includedCount": {
                          "maximum": 10000,
                          "minimum": 0,
                          "type": "integer"
                        },
                        "mode": {
                          "enum": [
                            "edited-delivery",
                            "select-before-editing",
                            "sell-by-photo"
                          ],
                          "type": "string"
                        },
                        "paymentTiming": {
                          "enum": [
                            "before-editing",
                            "after-approval"
                          ],
                          "type": "string"
                        },
                        "presentation": {
                          "additionalProperties": false,
                          "properties": {
                            "blocks": {
                              "items": {
                                "additionalProperties": false,
                                "properties": {
                                  "captureIds": {
                                    "items": {
                                      "format": "uuid",
                                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                      "type": "string"
                                    },
                                    "maxItems": 1000,
                                    "type": "array"
                                  },
                                  "chapterId": {
                                    "format": "uuid",
                                    "nullable": true,
                                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                    "type": "string"
                                  },
                                  "id": {
                                    "format": "uuid",
                                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                    "type": "string"
                                  },
                                  "selection": {
                                    "enum": [
                                      "automatic",
                                      "explicit"
                                    ],
                                    "type": "string"
                                  },
                                  "text": {
                                    "maxLength": 2000,
                                    "type": "string"
                                  },
                                  "type": {
                                    "enum": [
                                      "chapter",
                                      "grid",
                                      "full",
                                      "pair",
                                      "caption",
                                      "slideshow"
                                    ],
                                    "type": "string"
                                  }
                                },
                                "required": [
                                  "id",
                                  "type",
                                  "chapterId",
                                  "captureIds",
                                  "text"
                                ],
                                "type": "object"
                              },
                              "maxItems": 100,
                              "type": "array"
                            },
                            "coverCaptureId": {
                              "format": "uuid",
                              "nullable": true,
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                              "type": "string"
                            },
                            "coverFocal": {
                              "maximum": 100,
                              "minimum": 0,
                              "type": "number"
                            },
                            "coverTreatment": {
                              "enum": [
                                "full",
                                "split",
                                "quiet"
                              ],
                              "type": "string"
                            },
                            "font": {
                              "enum": [
                                "editorial",
                                "modern",
                                "script"
                              ],
                              "type": "string"
                            },
                            "introduction": {
                              "maxLength": 5000,
                              "type": "string"
                            },
                            "palette": {
                              "enum": [
                                "studio",
                                "ivory",
                                "charcoal"
                              ],
                              "type": "string"
                            },
                            "showChapters": {
                              "type": "boolean"
                            },
                            "showNumbers": {
                              "type": "boolean"
                            },
                            "spacing": {
                              "enum": [
                                "compact",
                                "comfortable",
                                "airy"
                              ],
                              "type": "string"
                            },
                            "template": {
                              "enum": [
                                "wedding",
                                "portrait",
                                "fine-art",
                                "proofing"
                              ],
                              "type": "string"
                            }
                          },
                          "required": [
                            "template",
                            "coverCaptureId",
                            "coverTreatment",
                            "coverFocal",
                            "font",
                            "palette",
                            "spacing",
                            "introduction",
                            "showChapters",
                            "showNumbers"
                          ],
                          "type": "object"
                        },
                        "proofWatermark": {
                          "additionalProperties": false,
                          "properties": {
                            "alignment": {
                              "default": "center",
                              "enum": [
                                "left",
                                "center",
                                "right"
                              ],
                              "type": "string"
                            },
                            "backing": {
                              "default": false,
                              "type": "boolean"
                            },
                            "color": {
                              "default": "#ffffff",
                              "pattern": "^#[\\da-fA-F]{6}$",
                              "type": "string"
                            },
                            "font": {
                              "default": "script",
                              "enum": [
                                "script",
                                "serif",
                                "sans"
                              ],
                              "type": "string"
                            },
                            "logoAssetId": {
                              "default": null,
                              "format": "uuid",
                              "nullable": true,
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                              "type": "string"
                            },
                            "logoPosition": {
                              "default": "above",
                              "enum": [
                                "above",
                                "below",
                                "left",
                                "right"
                              ],
                              "type": "string"
                            },
                            "logoScale": {
                              "default": 1,
                              "maximum": 4,
                              "minimum": 0.25,
                              "type": "number"
                            },
                            "logoVariant": {
                              "default": "original",
                              "enum": [
                                "original",
                                "light",
                                "dark"
                              ],
                              "type": "string"
                            },
                            "margin": {
                              "default": 4,
                              "maximum": 25,
                              "minimum": 0,
                              "type": "number"
                            },
                            "opacity": {
                              "default": 45,
                              "maximum": 100,
                              "minimum": 1,
                              "type": "number"
                            },
                            "outline": {
                              "default": false,
                              "type": "boolean"
                            },
                            "pattern": {
                              "default": "signature",
                              "enum": [
                                "signature",
                                "centre",
                                "diagonal",
                                "tile"
                              ],
                              "type": "string"
                            },
                            "position": {
                              "default": "bottom-right",
                              "enum": [
                                "top-left",
                                "top-right",
                                "bottom-left",
                                "bottom-right",
                                "center"
                              ],
                              "type": "string"
                            },
                            "rotation": {
                              "default": 0,
                              "maximum": 180,
                              "minimum": -180,
                              "type": "number"
                            },
                            "secondLine": {
                              "default": "",
                              "maxLength": 200,
                              "type": "string"
                            },
                            "size": {
                              "default": 6,
                              "maximum": 30,
                              "minimum": 1,
                              "type": "number"
                            },
                            "spacing": {
                              "default": 6,
                              "maximum": 100,
                              "minimum": 0,
                              "type": "number"
                            },
                            "text": {
                              "maxLength": 200,
                              "minLength": 1,
                              "type": "string"
                            },
                            "type": {
                              "default": "text",
                              "enum": [
                                "text",
                                "logo",
                                "both"
                              ],
                              "type": "string"
                            }
                          },
                          "required": [
                            "text"
                          ],
                          "type": "object"
                        },
                        "selectionDeadline": {
                          "format": "date-time",
                          "nullable": true,
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                          "type": "string"
                        },
                        "terms": {
                          "maxLength": 5000,
                          "type": "string"
                        },
                        "title": {
                          "maxLength": 200,
                          "minLength": 1,
                          "type": "string"
                        },
                        "turnaroundDays": {
                          "maximum": 365,
                          "minimum": 0,
                          "type": "integer"
                        },
                        "webWatermark": {
                          "additionalProperties": false,
                          "nullable": true,
                          "properties": {
                            "alignment": {
                              "default": "center",
                              "enum": [
                                "left",
                                "center",
                                "right"
                              ],
                              "type": "string"
                            },
                            "backing": {
                              "default": false,
                              "type": "boolean"
                            },
                            "color": {
                              "default": "#ffffff",
                              "pattern": "^#[\\da-fA-F]{6}$",
                              "type": "string"
                            },
                            "font": {
                              "default": "script",
                              "enum": [
                                "script",
                                "serif",
                                "sans"
                              ],
                              "type": "string"
                            },
                            "logoAssetId": {
                              "default": null,
                              "format": "uuid",
                              "nullable": true,
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                              "type": "string"
                            },
                            "logoPosition": {
                              "default": "above",
                              "enum": [
                                "above",
                                "below",
                                "left",
                                "right"
                              ],
                              "type": "string"
                            },
                            "logoScale": {
                              "default": 1,
                              "maximum": 4,
                              "minimum": 0.25,
                              "type": "number"
                            },
                            "logoVariant": {
                              "default": "original",
                              "enum": [
                                "original",
                                "light",
                                "dark"
                              ],
                              "type": "string"
                            },
                            "margin": {
                              "default": 4,
                              "maximum": 25,
                              "minimum": 0,
                              "type": "number"
                            },
                            "opacity": {
                              "default": 45,
                              "maximum": 100,
                              "minimum": 1,
                              "type": "number"
                            },
                            "outline": {
                              "default": false,
                              "type": "boolean"
                            },
                            "pattern": {
                              "default": "signature",
                              "enum": [
                                "signature",
                                "centre",
                                "diagonal",
                                "tile"
                              ],
                              "type": "string"
                            },
                            "position": {
                              "default": "bottom-right",
                              "enum": [
                                "top-left",
                                "top-right",
                                "bottom-left",
                                "bottom-right",
                                "center"
                              ],
                              "type": "string"
                            },
                            "rotation": {
                              "default": 0,
                              "maximum": 180,
                              "minimum": -180,
                              "type": "number"
                            },
                            "secondLine": {
                              "default": "",
                              "maxLength": 200,
                              "type": "string"
                            },
                            "size": {
                              "default": 6,
                              "maximum": 30,
                              "minimum": 1,
                              "type": "number"
                            },
                            "spacing": {
                              "default": 6,
                              "maximum": 100,
                              "minimum": 0,
                              "type": "number"
                            },
                            "text": {
                              "maxLength": 200,
                              "minLength": 1,
                              "type": "string"
                            },
                            "type": {
                              "default": "text",
                              "enum": [
                                "text",
                                "logo",
                                "both"
                              ],
                              "type": "string"
                            }
                          },
                          "required": [
                            "text"
                          ],
                          "type": "object"
                        }
                      },
                      "required": [
                        "presentation",
                        "title",
                        "mode",
                        "paymentTiming",
                        "currency",
                        "includedCount",
                        "additionalPrice",
                        "collectionPrice",
                        "bundles",
                        "terms",
                        "selectionDeadline",
                        "expiresAt",
                        "turnaroundDays",
                        "proofWatermark",
                        "webWatermark",
                        "downloadWatermark"
                      ],
                      "type": "object"
                    },
                    "id": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "name",
                    "config"
                  ],
                  "type": "object"
                },
                "type": "array"
              },
              "publication": {
                "nullable": true,
                "properties": {
                  "completed": {
                    "maximum": 9007199254740991,
                    "minimum": -9007199254740991,
                    "type": "integer"
                  },
                  "error": {
                    "nullable": true,
                    "type": "string"
                  },
                  "failedCaptureId": {
                    "format": "uuid",
                    "nullable": true,
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                    "type": "string"
                  },
                  "id": {
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                    "type": "string"
                  },
                  "status": {
                    "enum": [
                      "queued",
                      "rendering",
                      "ready",
                      "failed"
                    ],
                    "type": "string"
                  },
                  "total": {
                    "maximum": 9007199254740991,
                    "minimum": -9007199254740991,
                    "type": "integer"
                  }
                },
                "required": [
                  "id",
                  "status",
                  "completed",
                  "total",
                  "error",
                  "failedCaptureId"
                ],
                "type": "object"
              },
              "receipts": {
                "items": {
                  "properties": {
                    "action": {
                      "type": "string"
                    },
                    "createdAt": {
                      "type": "string"
                    },
                    "id": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "orderId": {
                      "format": "uuid",
                      "nullable": true,
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "recipientId": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "reference": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "orderId",
                    "recipientId",
                    "action",
                    "reference",
                    "createdAt"
                  ],
                  "type": "object"
                },
                "type": "array"
              },
              "recipients": {
                "items": {
                  "properties": {
                    "canDownload": {
                      "type": "boolean"
                    },
                    "canProof": {
                      "type": "boolean"
                    },
                    "captureIds": {
                      "items": {
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "maxItems": 10000,
                      "nullable": true,
                      "type": "array"
                    },
                    "choices": {
                      "items": {
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "maxItems": 10000,
                      "type": "array"
                    },
                    "expiresAt": {
                      "format": "date-time",
                      "nullable": true,
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                      "type": "string"
                    },
                    "id": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "notes": {
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "annotations": {
                            "items": {
                              "additionalProperties": false,
                              "properties": {
                                "height": {
                                  "maximum": 1,
                                  "minimum": 0,
                                  "type": "number"
                                },
                                "text": {
                                  "maxLength": 500,
                                  "type": "string"
                                },
                                "width": {
                                  "maximum": 1,
                                  "minimum": 0,
                                  "type": "number"
                                },
                                "x": {
                                  "maximum": 1,
                                  "minimum": 0,
                                  "type": "number"
                                },
                                "y": {
                                  "maximum": 1,
                                  "minimum": 0,
                                  "type": "number"
                                }
                              },
                              "required": [
                                "x",
                                "y",
                                "width",
                                "height",
                                "text"
                              ],
                              "type": "object"
                            },
                            "maxItems": 20,
                            "type": "array"
                          },
                          "captureId": {
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                            "type": "string"
                          },
                          "text": {
                            "maxLength": 2000,
                            "type": "string"
                          }
                        },
                        "required": [
                          "captureId",
                          "text"
                        ],
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "passwordProtected": {
                      "type": "boolean"
                    },
                    "revoked": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "id",
                    "name",
                    "revoked",
                    "expiresAt",
                    "canProof",
                    "canDownload",
                    "captureIds",
                    "choices",
                    "notes",
                    "passwordProtected"
                  ],
                  "type": "object"
                },
                "type": "array"
              },
              "revision": {
                "format": "uuid",
                "nullable": true,
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                "type": "string"
              },
              "rounds": {
                "items": {
                  "properties": {
                    "captureIds": {
                      "items": {
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                        "type": "string"
                      },
                      "maxItems": 10000,
                      "type": "array"
                    },
                    "createdAt": {
                      "type": "string"
                    },
                    "id": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    },
                    "notes": {
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "annotations": {
                            "items": {
                              "additionalProperties": false,
                              "properties": {
                                "height": {
                                  "maximum": 1,
                                  "minimum": 0,
                                  "type": "number"
                                },
                                "text": {
                                  "maxLength": 500,
                                  "type": "string"
                                },
                                "width": {
                                  "maximum": 1,
                                  "minimum": 0,
                                  "type": "number"
                                },
                                "x": {
                                  "maximum": 1,
                                  "minimum": 0,
                                  "type": "number"
                                },
                                "y": {
                                  "maximum": 1,
                                  "minimum": 0,
                                  "type": "number"
                                }
                              },
                              "required": [
                                "x",
                                "y",
                                "width",
                                "height",
                                "text"
                              ],
                              "type": "object"
                            },
                            "maxItems": 20,
                            "type": "array"
                          },
                          "captureId": {
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                            "type": "string"
                          },
                          "text": {
                            "maxLength": 2000,
                            "type": "string"
                          }
                        },
                        "required": [
                          "captureId",
                          "text"
                        ],
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "number": {
                      "maximum": 9007199254740991,
                      "minimum": -9007199254740991,
                      "type": "integer"
                    },
                    "recipientId": {
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "recipientId",
                    "number",
                    "captureIds",
                    "notes",
                    "createdAt"
                  ],
                  "type": "object"
                },
                "type": "array"
              },
              "shootId": {
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "studioPresets": {
                "properties": {
                  "presets": {
                    "items": {
                      "properties": {
                        "config": {
                          "additionalProperties": false,
                          "properties": {
                            "additionalPrice": {
                              "maximum": 100000000,
                              "minimum": 0,
                              "type": "integer"
                            },
                            "bundles": {
                              "items": {
                                "additionalProperties": false,
                                "properties": {
                                  "count": {
                                    "maximum": 10000,
                                    "minimum": 1,
                                    "type": "integer"
                                  },
                                  "price": {
                                    "maximum": 100000000,
                                    "minimum": 0,
                                    "type": "integer"
                                  }
                                },
                                "required": [
                                  "count",
                                  "price"
                                ],
                                "type": "object"
                              },
                              "maxItems": 20,
                              "type": "array"
                            },
                            "collectionPrice": {
                              "maximum": 100000000,
                              "minimum": 0,
                              "nullable": true,
                              "type": "integer"
                            },
                            "currency": {
                              "pattern": "^[A-Z]{3}$",
                              "type": "string"
                            },
                            "downloadOutputs": {
                              "items": {
                                "additionalProperties": false,
                                "properties": {
                                  "key": {
                                    "pattern": "^[a-z][a-z0-9-]{0,39}$",
                                    "type": "string"
                                  },
                                  "kind": {
                                    "enum": [
                                      "print",
                                      "web",
                                      "social"
                                    ],
                                    "type": "string"
                                  },
                                  "label": {
                                    "maxLength": 100,
                                    "minLength": 1,
                                    "type": "string"
                                  },
                                  "maxEdge": {
                                    "maximum": 65535,
                                    "minimum": 320,
                                    "type": "integer"
                                  },
                                  "watermark": {
                                    "additionalProperties": false,
                                    "nullable": true,
                                    "properties": {
                                      "alignment": {
                                        "default": "center",
                                        "enum": [
                                          "left",
                                          "center",
                                          "right"
                                        ],
                                        "type": "string"
                                      },
                                      "backing": {
                                        "default": false,
                                        "type": "boolean"
                                      },
                                      "color": {
                                        "default": "#ffffff",
                                        "pattern": "^#[\\da-fA-F]{6}$",
                                        "type": "string"
                                      },
                                      "font": {
                                        "default": "script",
                                        "enum": [
                                          "script",
                                          "serif",
                                          "sans"
                                        ],
                                        "type": "string"
                                      },
                                      "logoAssetId": {
                                        "default": null,
                                        "format": "uuid",
                                        "nullable": true,
                                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                        "type": "string"
                                      },
                                      "logoPosition": {
                                        "default": "above",
                                        "enum": [
                                          "above",
                                          "below",
                                          "left",
                                          "right"
                                        ],
                                        "type": "string"
                                      },
                                      "logoScale": {
                                        "default": 1,
                                        "maximum": 4,
                                        "minimum": 0.25,
                                        "type": "number"
                                      },
                                      "logoVariant": {
                                        "default": "original",
                                        "enum": [
                                          "original",
                                          "light",
                                          "dark"
                                        ],
                                        "type": "string"
                                      },
                                      "margin": {
                                        "default": 4,
                                        "maximum": 25,
                                        "minimum": 0,
                                        "type": "number"
                                      },
                                      "opacity": {
                                        "default": 45,
                                        "maximum": 100,
                                        "minimum": 1,
                                        "type": "number"
                                      },
                                      "outline": {
                                        "default": false,
                                        "type": "boolean"
                                      },
                                      "pattern": {
                                        "default": "signature",
                                        "enum": [
                                          "signature",
                                          "centre",
                                          "diagonal",
                                          "tile"
                                        ],
                                        "type": "string"
                                      },
                                      "position": {
                                        "default": "bottom-right",
                                        "enum": [
                                          "top-left",
                                          "top-right",
                                          "bottom-left",
                                          "bottom-right",
                                          "center"
                                        ],
                                        "type": "string"
                                      },
                                      "rotation": {
                                        "default": 0,
                                        "maximum": 180,
                                        "minimum": -180,
                                        "type": "number"
                                      },
                                      "secondLine": {
                                        "default": "",
                                        "maxLength": 200,
                                        "type": "string"
                                      },
                                      "size": {
                                        "default": 6,
                                        "maximum": 30,
                                        "minimum": 1,
                                        "type": "number"
                                      },
                                      "spacing": {
                                        "default": 6,
                                        "maximum": 100,
                                        "minimum": 0,
                                        "type": "number"
                                      },
                                      "text": {
                                        "maxLength": 200,
                                        "minLength": 1,
                                        "type": "string"
                                      },
                                      "type": {
                                        "default": "text",
                                        "enum": [
                                          "text",
                                          "logo",
                                          "both"
                                        ],
                                        "type": "string"
                                      }
                                    },
                                    "required": [
                                      "text"
                                    ],
                                    "type": "object"
                                  }
                                },
                                "required": [
                                  "key",
                                  "label",
                                  "kind",
                                  "maxEdge",
                                  "watermark"
                                ],
                                "type": "object"
                              },
                              "maxItems": 6,
                              "minItems": 1,
                              "type": "array"
                            },
                            "downloadWatermark": {
                              "additionalProperties": false,
                              "nullable": true,
                              "properties": {
                                "alignment": {
                                  "default": "center",
                                  "enum": [
                                    "left",
                                    "center",
                                    "right"
                                  ],
                                  "type": "string"
                                },
                                "backing": {
                                  "default": false,
                                  "type": "boolean"
                                },
                                "color": {
                                  "default": "#ffffff",
                                  "pattern": "^#[\\da-fA-F]{6}$",
                                  "type": "string"
                                },
                                "font": {
                                  "default": "script",
                                  "enum": [
                                    "script",
                                    "serif",
                                    "sans"
                                  ],
                                  "type": "string"
                                },
                                "logoAssetId": {
                                  "default": null,
                                  "format": "uuid",
                                  "nullable": true,
                                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                  "type": "string"
                                },
                                "logoPosition": {
                                  "default": "above",
                                  "enum": [
                                    "above",
                                    "below",
                                    "left",
                                    "right"
                                  ],
                                  "type": "string"
                                },
                                "logoScale": {
                                  "default": 1,
                                  "maximum": 4,
                                  "minimum": 0.25,
                                  "type": "number"
                                },
                                "logoVariant": {
                                  "default": "original",
                                  "enum": [
                                    "original",
                                    "light",
                                    "dark"
                                  ],
                                  "type": "string"
                                },
                                "margin": {
                                  "default": 4,
                                  "maximum": 25,
                                  "minimum": 0,
                                  "type": "number"
                                },
                                "opacity": {
                                  "default": 45,
                                  "maximum": 100,
                                  "minimum": 1,
                                  "type": "number"
                                },
                                "outline": {
                                  "default": false,
                                  "type": "boolean"
                                },
                                "pattern": {
                                  "default": "signature",
                                  "enum": [
                                    "signature",
                                    "centre",
                                    "diagonal",
                                    "tile"
                                  ],
                                  "type": "string"
                                },
                                "position": {
                                  "default": "bottom-right",
                                  "enum": [
                                    "top-left",
                                    "top-right",
                                    "bottom-left",
                                    "bottom-right",
                                    "center"
                                  ],
                                  "type": "string"
                                },
                                "rotation": {
                                  "default": 0,
                                  "maximum": 180,
                                  "minimum": -180,
                                  "type": "number"
                                },
                                "secondLine": {
                                  "default": "",
                                  "maxLength": 200,
                                  "type": "string"
                                },
                                "size": {
                                  "default": 6,
                                  "maximum": 30,
                                  "minimum": 1,
                                  "type": "number"
                                },
                                "spacing": {
                                  "default": 6,
                                  "maximum": 100,
                                  "minimum": 0,
                                  "type": "number"
                                },
                                "text": {
                                  "maxLength": 200,
                                  "minLength": 1,
                                  "type": "string"
                                },
                                "type": {
                                  "default": "text",
                                  "enum": [
                                    "text",
                                    "logo",
                                    "both"
                                  ],
                                  "type": "string"
                                }
                              },
                              "required": [
                                "text"
                              ],
                              "type": "object"
                            },
                            "expiresAt": {
                              "format": "date-time",
                              "nullable": true,
                              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                              "type": "string"
                            },
                            "includedCount": {
                              "maximum": 10000,
                              "minimum": 0,
                              "type": "integer"
                            },
                            "mode": {
                              "enum": [
                                "edited-delivery",
                                "select-before-editing",
                                "sell-by-photo"
                              ],
                              "type": "string"
                            },
                            "paymentTiming": {
                              "enum": [
                                "before-editing",
                                "after-approval"
                              ],
                              "type": "string"
                            },
                            "presentation": {
                              "additionalProperties": false,
                              "properties": {
                                "blocks": {
                                  "items": {
                                    "additionalProperties": false,
                                    "properties": {
                                      "captureIds": {
                                        "items": {
                                          "format": "uuid",
                                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                          "type": "string"
                                        },
                                        "maxItems": 1000,
                                        "type": "array"
                                      },
                                      "chapterId": {
                                        "format": "uuid",
                                        "nullable": true,
                                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                        "type": "string"
                                      },
                                      "id": {
                                        "format": "uuid",
                                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                        "type": "string"
                                      },
                                      "selection": {
                                        "enum": [
                                          "automatic",
                                          "explicit"
                                        ],
                                        "type": "string"
                                      },
                                      "text": {
                                        "maxLength": 2000,
                                        "type": "string"
                                      },
                                      "type": {
                                        "enum": [
                                          "chapter",
                                          "grid",
                                          "full",
                                          "pair",
                                          "caption",
                                          "slideshow"
                                        ],
                                        "type": "string"
                                      }
                                    },
                                    "required": [
                                      "id",
                                      "type",
                                      "chapterId",
                                      "captureIds",
                                      "text"
                                    ],
                                    "type": "object"
                                  },
                                  "maxItems": 100,
                                  "type": "array"
                                },
                                "coverCaptureId": {
                                  "format": "uuid",
                                  "nullable": true,
                                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                  "type": "string"
                                },
                                "coverFocal": {
                                  "maximum": 100,
                                  "minimum": 0,
                                  "type": "number"
                                },
                                "coverTreatment": {
                                  "enum": [
                                    "full",
                                    "split",
                                    "quiet"
                                  ],
                                  "type": "string"
                                },
                                "font": {
                                  "enum": [
                                    "editorial",
                                    "modern",
                                    "script"
                                  ],
                                  "type": "string"
                                },
                                "introduction": {
                                  "maxLength": 5000,
                                  "type": "string"
                                },
                                "palette": {
                                  "enum": [
                                    "studio",
                                    "ivory",
                                    "charcoal"
                                  ],
                                  "type": "string"
                                },
                                "showChapters": {
                                  "type": "boolean"
                                },
                                "showNumbers": {
                                  "type": "boolean"
                                },
                                "spacing": {
                                  "enum": [
                                    "compact",
                                    "comfortable",
                                    "airy"
                                  ],
                                  "type": "string"
                                },
                                "template": {
                                  "enum": [
                                    "wedding",
                                    "portrait",
                                    "fine-art",
                                    "proofing"
                                  ],
                                  "type": "string"
                                }
                              },
                              "required": [
                                "template",
                                "coverCaptureId",
                                "coverTreatment",
                                "coverFocal",
                                "font",
                                "palette",
                                "spacing",
                                "introduction",
                                "showChapters",
                                "showNumbers"
                              ],
                              "type": "object"
                            },
                            "proofWatermark": {
                              "additionalProperties": false,
                              "properties": {
                                "alignment": {
                                  "default": "center",
                                  "enum": [
                                    "left",
                                    "center",
                                    "right"
                                  ],
                                  "type": "string"
                                },
                                "backing": {
                                  "default": false,
                                  "type": "boolean"
                                },
                                "color": {
                                  "default": "#ffffff",
                                  "pattern": "^#[\\da-fA-F]{6}$",
                                  "type": "string"
                                },
                                "font": {
                                  "default": "script",
                                  "enum": [
                                    "script",
                                    "serif",
                                    "sans"
                                  ],
                                  "type": "string"
                                },
                                "logoAssetId": {
                                  "default": null,
                                  "format": "uuid",
                                  "nullable": true,
                                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                  "type": "string"
                                },
                                "logoPosition": {
                                  "default": "above",
                                  "enum": [
                                    "above",
                                    "below",
                                    "left",
                                    "right"
                                  ],
                                  "type": "string"
                                },
                                "logoScale": {
                                  "default": 1,
                                  "maximum": 4,
                                  "minimum": 0.25,
                                  "type": "number"
                                },
                                "logoVariant": {
                                  "default": "original",
                                  "enum": [
                                    "original",
                                    "light",
                                    "dark"
                                  ],
                                  "type": "string"
                                },
                                "margin": {
                                  "default": 4,
                                  "maximum": 25,
                                  "minimum": 0,
                                  "type": "number"
                                },
                                "opacity": {
                                  "default": 45,
                                  "maximum": 100,
                                  "minimum": 1,
                                  "type": "number"
                                },
                                "outline": {
                                  "default": false,
                                  "type": "boolean"
                                },
                                "pattern": {
                                  "default": "signature",
                                  "enum": [
                                    "signature",
                                    "centre",
                                    "diagonal",
                                    "tile"
                                  ],
                                  "type": "string"
                                },
                                "position": {
                                  "default": "bottom-right",
                                  "enum": [
                                    "top-left",
                                    "top-right",
                                    "bottom-left",
                                    "bottom-right",
                                    "center"
                                  ],
                                  "type": "string"
                                },
                                "rotation": {
                                  "default": 0,
                                  "maximum": 180,
                                  "minimum": -180,
                                  "type": "number"
                                },
                                "secondLine": {
                                  "default": "",
                                  "maxLength": 200,
                                  "type": "string"
                                },
                                "size": {
                                  "default": 6,
                                  "maximum": 30,
                                  "minimum": 1,
                                  "type": "number"
                                },
                                "spacing": {
                                  "default": 6,
                                  "maximum": 100,
                                  "minimum": 0,
                                  "type": "number"
                                },
                                "text": {
                                  "maxLength": 200,
                                  "minLength": 1,
                                  "type": "string"
                                },
                                "type": {
                                  "default": "text",
                                  "enum": [
                                    "text",
                                    "logo",
                                    "both"
                                  ],
                                  "type": "string"
                                }
                              },
                              "required": [
                                "text"
                              ],
                              "type": "object"
                            },
                            "selectionDeadline": {
                              "format": "date-time",
                              "nullable": true,
                              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                              "type": "string"
                            },
                            "terms": {
                              "maxLength": 5000,
                              "type": "string"
                            },
                            "title": {
                              "maxLength": 200,
                              "minLength": 1,
                              "type": "string"
                            },
                            "turnaroundDays": {
                              "maximum": 365,
                              "minimum": 0,
                              "type": "integer"
                            },
                            "webWatermark": {
                              "additionalProperties": false,
                              "nullable": true,
                              "properties": {
                                "alignment": {
                                  "default": "center",
                                  "enum": [
                                    "left",
                                    "center",
                                    "right"
                                  ],
                                  "type": "string"
                                },
                                "backing": {
                                  "default": false,
                                  "type": "boolean"
                                },
                                "color": {
                                  "default": "#ffffff",
                                  "pattern": "^#[\\da-fA-F]{6}$",
                                  "type": "string"
                                },
                                "font": {
                                  "default": "script",
                                  "enum": [
                                    "script",
                                    "serif",
                                    "sans"
                                  ],
                                  "type": "string"
                                },
                                "logoAssetId": {
                                  "default": null,
                                  "format": "uuid",
                                  "nullable": true,
                                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                                  "type": "string"
                                },
                                "logoPosition": {
                                  "default": "above",
                                  "enum": [
                                    "above",
                                    "below",
                                    "left",
                                    "right"
                                  ],
                                  "type": "string"
                                },
                                "logoScale": {
                                  "default": 1,
                                  "maximum": 4,
                                  "minimum": 0.25,
                                  "type": "number"
                                },
                                "logoVariant": {
                                  "default": "original",
                                  "enum": [
                                    "original",
                                    "light",
                                    "dark"
                                  ],
                                  "type": "string"
                                },
                                "margin": {
                                  "default": 4,
                                  "maximum": 25,
                                  "minimum": 0,
                                  "type": "number"
                                },
                                "opacity": {
                                  "default": 45,
                                  "maximum": 100,
                                  "minimum": 1,
                                  "type": "number"
                                },
                                "outline": {
                                  "default": false,
                                  "type": "boolean"
                                },
                                "pattern": {
                                  "default": "signature",
                                  "enum": [
                                    "signature",
                                    "centre",
                                    "diagonal",
                                    "tile"
                                  ],
                                  "type": "string"
                                },
                                "position": {
                                  "default": "bottom-right",
                                  "enum": [
                                    "top-left",
                                    "top-right",
                                    "bottom-left",
                                    "bottom-right",
                                    "center"
                                  ],
                                  "type": "string"
                                },
                                "rotation": {
                                  "default": 0,
                                  "maximum": 180,
                                  "minimum": -180,
                                  "type": "number"
                                },
                                "secondLine": {
                                  "default": "",
                                  "maxLength": 200,
                                  "type": "string"
                                },
                                "size": {
                                  "default": 6,
                                  "maximum": 30,
                                  "minimum": 1,
                                  "type": "number"
                                },
                                "spacing": {
                                  "default": 6,
                                  "maximum": 100,
                                  "minimum": 0,
                                  "type": "number"
                                },
                                "text": {
                                  "maxLength": 200,
                                  "minLength": 1,
                                  "type": "string"
                                },
                                "type": {
                                  "default": "text",
                                  "enum": [
                                    "text",
                                    "logo",
                                    "both"
                                  ],
                                  "type": "string"
                                }
                              },
                              "required": [
                                "text"
                              ],
                              "type": "object"
                            }
                          },
                          "required": [
                            "presentation",
                            "title",
                            "mode",
                            "paymentTiming",
                            "currency",
                            "includedCount",
                            "additionalPrice",
                            "collectionPrice",
                            "bundles",
                            "terms",
                            "selectionDeadline",
                            "expiresAt",
                            "turnaroundDays",
                            "proofWatermark",
                            "webWatermark",
                            "downloadWatermark"
                          ],
                          "type": "object"
                        },
                        "id": {
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "id",
                        "name",
                        "config"
                      ],
                      "type": "object"
                    },
                    "type": "array"
                  },
                  "revision": {
                    "format": "uuid",
                    "nullable": true,
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                    "type": "string"
                  }
                },
                "required": [
                  "revision",
                  "presets"
                ],
                "type": "object"
              }
            },
            "required": [
              "revision",
              "shootId",
              "config",
              "presets",
              "studioPresets",
              "pendingEdits",
              "approvedVersions",
              "ordering",
              "captures",
              "chapters",
              "recipients",
              "rounds",
              "orders",
              "publication",
              "receipts",
              "approvals"
            ],
            "type": "object"
          }
        },
        "required": [
          "invitation",
          "workflow"
        ],
        "type": "object"
      },
      "PhotographyRecipientCreateDto": {
        "additionalProperties": false,
        "properties": {
          "canDownload": {
            "type": "boolean"
          },
          "canProof": {
            "type": "boolean"
          },
          "captureIds": {
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 10000,
            "nullable": true,
            "type": "array"
          },
          "expectedRevision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "expiresAt": {
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "name": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "password": {
            "maxLength": 72,
            "minLength": 8,
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "canDownload",
          "canProof",
          "captureIds",
          "expectedRevision",
          "expiresAt",
          "name",
          "password"
        ],
        "type": "object"
      },
      "PhotographyRecipientUpdateDto": {
        "additionalProperties": false,
        "properties": {
          "canDownload": {
            "type": "boolean"
          },
          "canProof": {
            "type": "boolean"
          },
          "captureIds": {
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 10000,
            "nullable": true,
            "type": "array"
          },
          "expectedRevision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "expiresAt": {
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "revoked": {
            "type": "boolean"
          }
        },
        "required": [
          "canDownload",
          "canProof",
          "captureIds",
          "expectedRevision",
          "expiresAt",
          "revoked"
        ],
        "type": "object"
      },
      "PhotographyStudioPresetApplyDto": {
        "additionalProperties": false,
        "properties": {
          "expectedPresetRevision": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "expectedRevision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          }
        },
        "required": [
          "expectedPresetRevision",
          "expectedRevision"
        ],
        "type": "object"
      },
      "PluginResponseDto": {
        "properties": {
          "author": {
            "description": "Plugin author",
            "type": "string"
          },
          "createdAt": {
            "description": "Creation date",
            "type": "string"
          },
          "description": {
            "description": "Plugin description",
            "type": "string"
          },
          "id": {
            "description": "Plugin ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "methods": {
            "description": "Plugin methods",
            "items": {
              "$ref": "#/components/schemas/PluginMethodResponseDto"
            },
            "type": "array"
          },
          "name": {
            "description": "Plugin name",
            "type": "string"
          },
          "title": {
            "description": "Plugin title",
            "type": "string"
          },
          "updatedAt": {
            "description": "Last update date",
            "type": "string"
          },
          "version": {
            "description": "Plugin version",
            "type": "string"
          }
        },
        "required": [
          "author",
          "createdAt",
          "description",
          "id",
          "methods",
          "name",
          "title",
          "updatedAt",
          "version"
        ],
        "type": "object"
      },
      "PluginMethodResponseDto": {
        "properties": {
          "allowedHosts": {
            "description": "Hosts this method may send requests to; empty when it cannot reach other servers",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "description": {
            "description": "Description",
            "type": "string"
          },
          "hostFunctions": {
            "type": "boolean"
          },
          "key": {
            "description": "Key",
            "type": "string"
          },
          "name": {
            "description": "Name",
            "type": "string"
          },
          "schema": {
            "properties": {},
            "type": "object"
          },
          "title": {
            "description": "Title",
            "type": "string"
          },
          "types": {
            "description": "Workflow types",
            "items": {
              "$ref": "#/components/schemas/WorkflowType"
            },
            "type": "array"
          },
          "uiHints": {
            "description": "Ui hints",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "allowedHosts",
          "description",
          "hostFunctions",
          "key",
          "name",
          "title",
          "types",
          "uiHints"
        ],
        "type": "object"
      },
      "WorkflowType": {
        "description": "Workflow type",
        "enum": [
          "AssetV1"
        ],
        "type": "string"
      },
      "WorkflowTrigger": {
        "description": "Plugin trigger type",
        "enum": [
          "AssetCreate",
          "AssetMetadataExtraction",
          "AssetTagged"
        ],
        "type": "string"
      },
      "PluginTemplateResponseDto": {
        "properties": {
          "description": {
            "description": "Template description",
            "type": "string"
          },
          "key": {
            "description": "Template key (unique across all templates)",
            "type": "string"
          },
          "steps": {
            "description": "Workflow steps",
            "items": {
              "$ref": "#/components/schemas/PluginTemplateStepResponseDto"
            },
            "type": "array"
          },
          "title": {
            "description": "Template title",
            "type": "string"
          },
          "trigger": {
            "$ref": "#/components/schemas/WorkflowTrigger",
            "description": "Workflow trigger"
          },
          "uiHints": {
            "description": "Ui hints, for example \"smart-album\"",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "description",
          "key",
          "steps",
          "title",
          "trigger",
          "uiHints"
        ],
        "type": "object"
      },
      "PluginTemplateStepResponseDto": {
        "properties": {
          "config": {
            "additionalProperties": {},
            "description": "Step configuration",
            "nullable": true,
            "type": "object"
          },
          "enabled": {
            "description": "Whether the step is enabled",
            "type": "boolean"
          },
          "method": {
            "description": "Step plugin method",
            "type": "string"
          }
        },
        "required": [
          "config",
          "method"
        ],
        "type": "object"
      },
      "PreservationItemsResponseDto": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/PreservationItemDto"
            },
            "type": "array"
          },
          "total": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "type": "object"
      },
      "PreservationItemDto": {
        "properties": {
          "assetId": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "error": {
            "nullable": true,
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "locked": {
            "type": "boolean"
          },
          "name": {
            "nullable": true,
            "type": "string"
          },
          "reasonKey": {
            "nullable": true,
            "type": "string"
          },
          "sha256": {
            "nullable": true,
            "type": "string"
          },
          "sizeBytes": {
            "nullable": true,
            "type": "string"
          },
          "sourceAssetId": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/PreservationItemState"
          },
          "verifyState": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PreservationVerifyState"
              }
            ],
            "nullable": true
          }
        },
        "required": [
          "assetId",
          "error",
          "id",
          "locked",
          "name",
          "reasonKey",
          "sha256",
          "sizeBytes",
          "sourceAssetId",
          "state",
          "verifyState"
        ],
        "type": "object"
      },
      "PreservationVerifyState": {
        "description": "The latest verification of this item",
        "enum": [
          "ok",
          "missing",
          "changed"
        ],
        "type": "string"
      },
      "PreservationItemState": {
        "description": "`pending`, `copied`, `failed` or `skipped` for an export; `listed` for an item read from a package",
        "enum": [
          "pending",
          "copied",
          "failed",
          "skipped",
          "listed"
        ],
        "type": "string"
      },
      "PreservationPreviewResponseDto": {
        "properties": {
          "bytes": {
            "type": "string"
          },
          "freeBytes": {
            "description": "Free space where the package would be written",
            "nullable": true,
            "type": "string"
          },
          "includedBytes": {
            "type": "string"
          },
          "includedItems": {
            "description": "Items the export would include",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "items": {
            "description": "Items matching, Locked ones not counted",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "lockedAllowed": {
            "description": "This session is unlocked, so Locked items may be included",
            "type": "boolean"
          },
          "lockedBytes": {
            "type": "string"
          },
          "lockedItems": {
            "description": "Locked items matching",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "maxItems": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "support": {
            "items": {
              "$ref": "#/components/schemas/PreservationSupportDto"
            },
            "type": "array"
          },
          "withinLimit": {
            "type": "boolean"
          }
        },
        "required": [
          "bytes",
          "freeBytes",
          "includedBytes",
          "includedItems",
          "items",
          "lockedAllowed",
          "lockedBytes",
          "lockedItems",
          "maxItems",
          "support",
          "withinLimit"
        ],
        "type": "object"
      },
      "PreservationSupportDto": {
        "properties": {
          "category": {
            "$ref": "#/components/schemas/PreservationSupportCategory"
          },
          "level": {
            "$ref": "#/components/schemas/PreservationSupportLevel"
          }
        },
        "required": [
          "category",
          "level"
        ],
        "type": "object"
      },
      "PreservationSupportLevel": {
        "description": "`restored`: comes back as it was; `restored-when-empty`: only where the library has none; `provenance-only`: kept as a record, never applied; `not-included`: not in a package",
        "enum": [
          "restored",
          "restored-when-empty",
          "provenance-only",
          "not-included"
        ],
        "type": "string"
      },
      "PreservationSupportCategory": {
        "description": "A kind of information a package may carry",
        "enum": [
          "originals",
          "dates",
          "places",
          "descriptions",
          "ratings",
          "favorites",
          "archive",
          "locked",
          "albums",
          "tags",
          "people",
          "editRecipes",
          "livePhotos",
          "stacks",
          "documentCorrections",
          "momentNotes",
          "generatedDescriptions",
          "generatedMoments",
          "cameraDetails",
          "sharing",
          "pets",
          "studioProjects",
          "memories"
        ],
        "type": "string"
      },
      "PreservationPreviewDto": {
        "properties": {
          "includeLocked": {
            "description": "Count Locked items as included; needs an unlocked session",
            "type": "boolean"
          },
          "scope": {
            "$ref": "#/components/schemas/PreservationScopeDto"
          }
        },
        "type": "object"
      },
      "PreservationScopeDto": {
        "description": "What to preserve. Only your own items are ever included: never a partner’s or a shared album’s.",
        "properties": {
          "assetIds": {
            "description": "Exactly these items of yours, instead of a filter",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 100000,
            "minItems": 1,
            "type": "array"
          },
          "filter": {
            "$ref": "#/components/schemas/SearchFilter",
            "description": "Your items matching these conditions; the whole library when empty"
          }
        },
        "type": "object"
      },
      "SearchFilter": {
        "additionalProperties": false,
        "properties": {
          "albumIds": {
            "$ref": "#/components/schemas/IdsFilter"
          },
          "checksum": {
            "$ref": "#/components/schemas/StringFilter"
          },
          "city": {
            "$ref": "#/components/schemas/StringFilterNullable"
          },
          "country": {
            "$ref": "#/components/schemas/StringFilterNullable"
          },
          "createdAt": {
            "$ref": "#/components/schemas/DateFilter"
          },
          "description": {
            "$ref": "#/components/schemas/StringPatternFilter"
          },
          "encodedVideoPath": {
            "$ref": "#/components/schemas/StringFilter"
          },
          "fileSizeInBytes": {
            "$ref": "#/components/schemas/NumberFilter"
          },
          "hasAlbums": {
            "$ref": "#/components/schemas/BoolFilter"
          },
          "hasPeople": {
            "$ref": "#/components/schemas/BoolFilter"
          },
          "hasTags": {
            "$ref": "#/components/schemas/BoolFilter"
          },
          "id": {
            "$ref": "#/components/schemas/IdFilter"
          },
          "isEncoded": {
            "$ref": "#/components/schemas/BoolFilter"
          },
          "isFavorite": {
            "$ref": "#/components/schemas/BoolFilter"
          },
          "isMotion": {
            "$ref": "#/components/schemas/BoolFilter"
          },
          "isOffline": {
            "$ref": "#/components/schemas/BoolFilter"
          },
          "lensModel": {
            "$ref": "#/components/schemas/StringPatternFilter"
          },
          "libraryId": {
            "$ref": "#/components/schemas/IdFilterNullable"
          },
          "localDateTime": {
            "$ref": "#/components/schemas/DateFilter"
          },
          "make": {
            "$ref": "#/components/schemas/StringPatternFilter"
          },
          "model": {
            "$ref": "#/components/schemas/StringPatternFilter"
          },
          "ocr": {
            "$ref": "#/components/schemas/StringSimilarityFilter"
          },
          "or": {
            "items": {
              "$ref": "#/components/schemas/SearchFilterBranch"
            },
            "minItems": 1,
            "type": "array"
          },
          "originalFileName": {
            "$ref": "#/components/schemas/StringPatternFilter"
          },
          "originalPath": {
            "$ref": "#/components/schemas/StringPatternFilter"
          },
          "personIds": {
            "$ref": "#/components/schemas/IdsFilter"
          },
          "petIds": {
            "$ref": "#/components/schemas/IdsFilter"
          },
          "rating": {
            "$ref": "#/components/schemas/NumberFilterNullable"
          },
          "state": {
            "$ref": "#/components/schemas/StringFilterNullable"
          },
          "tagIds": {
            "$ref": "#/components/schemas/IdsFilter"
          },
          "takenAt": {
            "$ref": "#/components/schemas/DateFilter"
          },
          "trashedAt": {
            "$ref": "#/components/schemas/DateFilterNullable"
          },
          "type": {
            "$ref": "#/components/schemas/EnumFilterAssetType"
          },
          "updatedAt": {
            "$ref": "#/components/schemas/DateFilter"
          },
          "visibility": {
            "$ref": "#/components/schemas/EnumFilterAssetVisibility"
          }
        },
        "type": "object"
      },
      "EnumFilterAssetVisibility": {
        "properties": {
          "eq": {
            "$ref": "#/components/schemas/AssetVisibility"
          },
          "in": {
            "items": {
              "$ref": "#/components/schemas/AssetVisibility"
            },
            "minItems": 1,
            "type": "array"
          },
          "ne": {
            "$ref": "#/components/schemas/AssetVisibility"
          },
          "notIn": {
            "items": {
              "$ref": "#/components/schemas/AssetVisibility"
            },
            "minItems": 1,
            "type": "array"
          }
        },
        "type": "object"
      },
      "DateFilter": {
        "properties": {
          "eq": {
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "gt": {
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "gte": {
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "lt": {
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "lte": {
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "ne": {
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "EnumFilterAssetType": {
        "properties": {
          "eq": {
            "$ref": "#/components/schemas/AssetTypeEnum"
          },
          "in": {
            "items": {
              "$ref": "#/components/schemas/AssetTypeEnum"
            },
            "minItems": 1,
            "type": "array"
          },
          "ne": {
            "$ref": "#/components/schemas/AssetTypeEnum"
          },
          "notIn": {
            "items": {
              "$ref": "#/components/schemas/AssetTypeEnum"
            },
            "minItems": 1,
            "type": "array"
          }
        },
        "type": "object"
      },
      "DateFilterNullable": {
        "properties": {
          "eq": {
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "gt": {
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "gte": {
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "lt": {
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "lte": {
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "ne": {
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "IdsFilter": {
        "properties": {
          "all": {
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          },
          "any": {
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          },
          "none": {
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          }
        },
        "type": "object"
      },
      "StringFilterNullable": {
        "properties": {
          "eq": {
            "nullable": true,
            "type": "string"
          },
          "in": {
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          },
          "ne": {
            "nullable": true,
            "type": "string"
          },
          "notIn": {
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          }
        },
        "type": "object"
      },
      "NumberFilterNullable": {
        "properties": {
          "eq": {
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "gt": {
            "format": "double",
            "type": "number"
          },
          "gte": {
            "format": "double",
            "type": "number"
          },
          "in": {
            "items": {
              "format": "double",
              "type": "number"
            },
            "minItems": 1,
            "type": "array"
          },
          "lt": {
            "format": "double",
            "type": "number"
          },
          "lte": {
            "format": "double",
            "type": "number"
          },
          "ne": {
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "notIn": {
            "items": {
              "format": "double",
              "type": "number"
            },
            "minItems": 1,
            "type": "array"
          }
        },
        "type": "object"
      },
      "StringPatternFilter": {
        "properties": {
          "endsWith": {
            "minLength": 1,
            "type": "string"
          },
          "eq": {
            "nullable": true,
            "type": "string"
          },
          "in": {
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          },
          "like": {
            "minLength": 1,
            "type": "string"
          },
          "ne": {
            "nullable": true,
            "type": "string"
          },
          "notIn": {
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          },
          "notLike": {
            "minLength": 1,
            "type": "string"
          },
          "startsWith": {
            "minLength": 1,
            "type": "string"
          }
        },
        "type": "object"
      },
      "SearchFilterBranch": {
        "additionalProperties": false,
        "properties": {
          "albumIds": {
            "$ref": "#/components/schemas/IdsFilter"
          },
          "checksum": {
            "$ref": "#/components/schemas/StringFilter"
          },
          "city": {
            "$ref": "#/components/schemas/StringFilterNullable"
          },
          "country": {
            "$ref": "#/components/schemas/StringFilterNullable"
          },
          "createdAt": {
            "$ref": "#/components/schemas/DateFilter"
          },
          "description": {
            "$ref": "#/components/schemas/StringPatternFilter"
          },
          "encodedVideoPath": {
            "$ref": "#/components/schemas/StringFilter"
          },
          "fileSizeInBytes": {
            "$ref": "#/components/schemas/NumberFilter"
          },
          "hasAlbums": {
            "$ref": "#/components/schemas/BoolFilter"
          },
          "hasPeople": {
            "$ref": "#/components/schemas/BoolFilter"
          },
          "hasTags": {
            "$ref": "#/components/schemas/BoolFilter"
          },
          "id": {
            "$ref": "#/components/schemas/IdFilter"
          },
          "isEncoded": {
            "$ref": "#/components/schemas/BoolFilter"
          },
          "isFavorite": {
            "$ref": "#/components/schemas/BoolFilter"
          },
          "isMotion": {
            "$ref": "#/components/schemas/BoolFilter"
          },
          "isOffline": {
            "$ref": "#/components/schemas/BoolFilter"
          },
          "lensModel": {
            "$ref": "#/components/schemas/StringPatternFilter"
          },
          "libraryId": {
            "$ref": "#/components/schemas/IdFilterNullable"
          },
          "localDateTime": {
            "$ref": "#/components/schemas/DateFilter"
          },
          "make": {
            "$ref": "#/components/schemas/StringPatternFilter"
          },
          "model": {
            "$ref": "#/components/schemas/StringPatternFilter"
          },
          "ocr": {
            "$ref": "#/components/schemas/StringSimilarityFilter"
          },
          "originalFileName": {
            "$ref": "#/components/schemas/StringPatternFilter"
          },
          "originalPath": {
            "$ref": "#/components/schemas/StringPatternFilter"
          },
          "personIds": {
            "$ref": "#/components/schemas/IdsFilter"
          },
          "petIds": {
            "$ref": "#/components/schemas/IdsFilter"
          },
          "rating": {
            "$ref": "#/components/schemas/NumberFilterNullable"
          },
          "state": {
            "$ref": "#/components/schemas/StringFilterNullable"
          },
          "tagIds": {
            "$ref": "#/components/schemas/IdsFilter"
          },
          "takenAt": {
            "$ref": "#/components/schemas/DateFilter"
          },
          "trashedAt": {
            "$ref": "#/components/schemas/DateFilterNullable"
          },
          "type": {
            "$ref": "#/components/schemas/EnumFilterAssetType"
          },
          "updatedAt": {
            "$ref": "#/components/schemas/DateFilter"
          },
          "visibility": {
            "$ref": "#/components/schemas/EnumFilterAssetVisibility"
          }
        },
        "type": "object"
      },
      "StringSimilarityFilter": {
        "properties": {
          "matches": {
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "matches"
        ],
        "type": "object"
      },
      "IdFilterNullable": {
        "properties": {
          "eq": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "ne": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "BoolFilter": {
        "properties": {
          "eq": {
            "type": "boolean"
          }
        },
        "required": [
          "eq"
        ],
        "type": "object"
      },
      "IdFilter": {
        "properties": {
          "eq": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "ne": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "NumberFilter": {
        "properties": {
          "eq": {
            "format": "double",
            "type": "number"
          },
          "gt": {
            "format": "double",
            "type": "number"
          },
          "gte": {
            "format": "double",
            "type": "number"
          },
          "in": {
            "items": {
              "format": "double",
              "type": "number"
            },
            "minItems": 1,
            "type": "array"
          },
          "lt": {
            "format": "double",
            "type": "number"
          },
          "lte": {
            "format": "double",
            "type": "number"
          },
          "ne": {
            "format": "double",
            "type": "number"
          },
          "notIn": {
            "items": {
              "format": "double",
              "type": "number"
            },
            "minItems": 1,
            "type": "array"
          }
        },
        "type": "object"
      },
      "StringFilter": {
        "properties": {
          "eq": {
            "type": "string"
          },
          "in": {
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          },
          "ne": {
            "type": "string"
          },
          "notIn": {
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "type": "array"
          }
        },
        "type": "object"
      },
      "PreservationRestoreItemsResponseDto": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/PreservationRestoreItemDto"
            },
            "type": "array"
          },
          "total": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "type": "object"
      },
      "PreservationRestoreItemDto": {
        "properties": {
          "applied": {
            "type": "boolean"
          },
          "assetId": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "conflicts": {
            "items": {
              "$ref": "#/components/schemas/PreservationConflictDto"
            },
            "type": "array"
          },
          "error": {
            "nullable": true,
            "type": "string"
          },
          "findings": {
            "description": "Translation keys for what the restore left for you to look at",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "locked": {
            "description": "Locked in the package or in your library; listed only to an unlocked session",
            "type": "boolean"
          },
          "match": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PreservationRestoreMatch"
              }
            ],
            "nullable": true
          },
          "name": {
            "nullable": true,
            "type": "string"
          },
          "reasonKey": {
            "nullable": true,
            "type": "string"
          },
          "sourceAssetId": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/PreservationRestoreItemState"
          }
        },
        "required": [
          "applied",
          "assetId",
          "conflicts",
          "error",
          "findings",
          "id",
          "locked",
          "match",
          "name",
          "reasonKey",
          "sourceAssetId",
          "state"
        ],
        "type": "object"
      },
      "PreservationRestoreItemState": {
        "enum": [
          "pending",
          "ready",
          "failed",
          "creating",
          "restored",
          "matched",
          "skipped"
        ],
        "type": "string"
      },
      "PreservationRestoreMatch": {
        "enum": [
          "new",
          "existing",
          "trashed"
        ],
        "type": "string"
      },
      "PreservationConflictDto": {
        "properties": {
          "archived": {
            "description": "The package’s value",
            "nullable": true,
            "type": "string"
          },
          "current": {
            "description": "The library’s value",
            "nullable": true,
            "type": "string"
          },
          "decision": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PreservationDecision"
              }
            ],
            "description": "Your choice; the restoration default applies when null",
            "nullable": true
          },
          "field": {
            "$ref": "#/components/schemas/PreservationConflictField"
          }
        },
        "required": [
          "archived",
          "current",
          "decision",
          "field"
        ],
        "type": "object"
      },
      "PreservationConflictField": {
        "description": "A field the package and the library can disagree about",
        "enum": [
          "date",
          "description",
          "location",
          "rating",
          "favorite",
          "archive",
          "editRecipe"
        ],
        "type": "string"
      },
      "PreservationDecision": {
        "description": "`keep` the library’s value, or `replace` it with the package’s",
        "enum": [
          "keep",
          "replace"
        ],
        "type": "string"
      },
      "PreservationRestoreItemFilter": {
        "enum": [
          "conflicts",
          "failed",
          "findings"
        ],
        "type": "string"
      },
      "QueueResponseDto": {
        "properties": {
          "hasUnfinishedWork": {
            "description": "Whether durable work remains, including delayed, paused and unadmitted work",
            "type": "boolean"
          },
          "isPaused": {
            "description": "Whether the queue is paused",
            "type": "boolean"
          },
          "name": {
            "$ref": "#/components/schemas/QueueName"
          },
          "statistics": {
            "$ref": "#/components/schemas/QueueStatisticsDto"
          }
        },
        "required": [
          "hasUnfinishedWork",
          "isPaused",
          "name",
          "statistics"
        ],
        "type": "object"
      },
      "QueueUpdateDto": {
        "properties": {
          "isPaused": {
            "description": "Whether to pause the queue",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "QueueDeleteDto": {
        "properties": {
          "failed": {
            "description": "If true, will also remove failed jobs from the queue.",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "QueueRetryFailedResponseDto": {
        "properties": {
          "count": {
            "description": "How many failed jobs were put back in the queue",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "type": "object"
      },
      "QueueOwnerStatisticsResponseDto": {
        "properties": {
          "active": {
            "description": "Number of active jobs",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "completed": {
            "description": "Number of completed jobs",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "delayed": {
            "description": "Number of delayed jobs",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "failed": {
            "description": "Number of failed jobs",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "paused": {
            "description": "Number of paused jobs",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "truncated": {
            "description": "Whether a state had more jobs than were scanned, so its count is a lower bound",
            "type": "boolean"
          },
          "waiting": {
            "description": "Number of waiting jobs",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "active",
          "completed",
          "delayed",
          "failed",
          "paused",
          "truncated",
          "waiting"
        ],
        "type": "object"
      },
      "AskSearchResponseDto": {
        "properties": {
          "explanation": {
            "description": "Short explanation of how the query was interpreted",
            "type": "string"
          },
          "plan": {
            "$ref": "#/components/schemas/AskSearchPlanDto"
          },
          "query": {
            "description": "Original Ask Search query",
            "type": "string"
          },
          "results": {
            "$ref": "#/components/schemas/SearchResponseDto"
          },
          "warnings": {
            "description": "Unsupported or ambiguous parts of the query",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "explanation",
          "plan",
          "query",
          "results",
          "warnings"
        ],
        "type": "object"
      },
      "SearchResponseDto": {
        "properties": {
          "albums": {
            "$ref": "#/components/schemas/SearchAlbumResponseDto"
          },
          "assets": {
            "$ref": "#/components/schemas/SearchAssetResponseDto"
          }
        },
        "required": [
          "albums",
          "assets"
        ],
        "type": "object"
      },
      "SearchAssetResponseDto": {
        "properties": {
          "count": {
            "description": "Number of assets in this page",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "facets": {
            "items": {
              "$ref": "#/components/schemas/SearchFacetResponseDto"
            },
            "type": "array"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/AssetResponseDto"
            },
            "type": "array"
          },
          "nextCursor": {
            "description": "Cursor for the next page of results",
            "nullable": true,
            "type": "string"
          },
          "nextPage": {
            "deprecated": true,
            "description": "Next page token",
            "nullable": true,
            "type": "string"
          },
          "total": {
            "description": "Total number of matching assets",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "count",
          "facets",
          "items",
          "nextCursor",
          "nextPage",
          "total"
        ],
        "type": "object"
      },
      "SearchFacetResponseDto": {
        "properties": {
          "counts": {
            "items": {
              "$ref": "#/components/schemas/SearchFacetCountResponseDto"
            },
            "type": "array"
          },
          "fieldName": {
            "description": "Facet field name",
            "type": "string"
          }
        },
        "required": [
          "counts",
          "fieldName"
        ],
        "type": "object"
      },
      "SearchFacetCountResponseDto": {
        "properties": {
          "count": {
            "description": "Number of assets with this facet value",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "coverAssetId": {
            "description": "The newest matching asset with this value (by capture time), when `facetCovers` was asked for",
            "nullable": true,
            "type": "string"
          },
          "label": {
            "description": "Display name when the value is an id (a person or a tag); the viewer's own name for it",
            "nullable": true,
            "type": "string"
          },
          "value": {
            "description": "Facet value",
            "type": "string"
          }
        },
        "required": [
          "count",
          "value"
        ],
        "type": "object"
      },
      "SearchAlbumResponseDto": {
        "properties": {
          "count": {
            "description": "Number of albums in this page",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "facets": {
            "items": {
              "$ref": "#/components/schemas/SearchFacetResponseDto"
            },
            "type": "array"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/AlbumResponseDto"
            },
            "type": "array"
          },
          "total": {
            "description": "Total number of matching albums",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "count",
          "facets",
          "items",
          "total"
        ],
        "type": "object"
      },
      "AskSearchPlanDto": {
        "properties": {
          "filters": {
            "description": "Structured filters applied to the search",
            "properties": {
              "albumIds": {
                "deprecated": true,
                "description": "Filter by album IDs",
                "items": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "type": "array"
              },
              "checksum": {
                "deprecated": true,
                "description": "Filter by file checksum",
                "type": "string"
              },
              "city": {
                "deprecated": true,
                "description": "Filter by city name",
                "nullable": true,
                "type": "string"
              },
              "country": {
                "deprecated": true,
                "description": "Filter by country name",
                "nullable": true,
                "type": "string"
              },
              "createdAfter": {
                "deprecated": true,
                "description": "Filter by creation date (after)",
                "example": "2024-01-01T00:00:00.000Z",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                "type": "string"
              },
              "createdBefore": {
                "deprecated": true,
                "description": "Filter by creation date (before)",
                "example": "2024-01-01T00:00:00.000Z",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                "type": "string"
              },
              "cursor": {
                "description": "Cursor for the next page of results",
                "minLength": 1,
                "type": "string"
              },
              "description": {
                "deprecated": true,
                "description": "Filter by description text",
                "type": "string"
              },
              "encodedVideoPath": {
                "deprecated": true,
                "description": "Filter by encoded video file path",
                "type": "string"
              },
              "filter": {
                "$ref": "#/components/schemas/SearchFilter"
              },
              "id": {
                "deprecated": true,
                "description": "Filter by asset ID",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "imageEnrichment": {
                "$ref": "#/components/schemas/ImageEnrichmentFilter"
              },
              "isEncoded": {
                "deprecated": true,
                "description": "Filter by encoded status",
                "type": "boolean"
              },
              "isFavorite": {
                "deprecated": true,
                "description": "Filter by favorite status",
                "type": "boolean"
              },
              "isMotion": {
                "deprecated": true,
                "description": "Filter by motion photo status",
                "type": "boolean"
              },
              "isNotInAlbum": {
                "deprecated": true,
                "description": "Filter assets not in any album",
                "type": "boolean"
              },
              "isOffline": {
                "deprecated": true,
                "description": "Filter by offline status",
                "type": "boolean"
              },
              "lensModel": {
                "deprecated": true,
                "description": "Filter by lens model",
                "nullable": true,
                "type": "string"
              },
              "libraryId": {
                "deprecated": true,
                "description": "Library ID to filter by",
                "format": "uuid",
                "nullable": true,
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                "type": "string"
              },
              "make": {
                "deprecated": true,
                "description": "Filter by camera make",
                "nullable": true,
                "type": "string"
              },
              "model": {
                "deprecated": true,
                "description": "Filter by camera model",
                "nullable": true,
                "type": "string"
              },
              "ocr": {
                "deprecated": true,
                "description": "Filter by OCR text content",
                "type": "string"
              },
              "order": {
                "$ref": "#/components/schemas/AssetOrder",
                "deprecated": true,
                "description": "Sort order"
              },
              "orderBy": {
                "$ref": "#/components/schemas/SearchOrder"
              },
              "originalFileName": {
                "deprecated": true,
                "description": "Filter by original file name",
                "type": "string"
              },
              "originalPath": {
                "deprecated": true,
                "description": "Filter by original file path",
                "type": "string"
              },
              "page": {
                "deprecated": true,
                "description": "Page number",
                "maximum": 9007199254740991,
                "minimum": 1,
                "type": "integer"
              },
              "personIds": {
                "deprecated": true,
                "description": "Filter by person IDs",
                "items": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "type": "array"
              },
              "petIds": {
                "deprecated": true,
                "description": "Filter by the caller's own pet IDs (confirmed pet observations only)",
                "items": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "type": "array"
              },
              "previewPath": {
                "deprecated": true,
                "description": "Filter by preview file path",
                "type": "string"
              },
              "rating": {
                "deprecated": true,
                "description": "Filter by rating [1-5], or null for unrated",
                "maximum": 5,
                "minimum": 1,
                "nullable": true,
                "type": "integer"
              },
              "size": {
                "description": "Number of results to return",
                "maximum": 1000,
                "minimum": 1,
                "type": "integer"
              },
              "state": {
                "deprecated": true,
                "description": "Filter by state/province name",
                "nullable": true,
                "type": "string"
              },
              "suppressedOnly": {
                "description": "Return only suppressed content. Requires an elevated session.",
                "type": "boolean"
              },
              "tagIds": {
                "deprecated": true,
                "description": "Filter by tag IDs",
                "items": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
                  "type": "string"
                },
                "nullable": true,
                "type": "array"
              },
              "takenAfter": {
                "deprecated": true,
                "description": "Filter by taken date (after)",
                "example": "2024-01-01T00:00:00.000Z",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                "type": "string"
              },
              "takenBefore": {
                "deprecated": true,
                "description": "Filter by taken date (before)",
                "example": "2024-01-01T00:00:00.000Z",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                "type": "string"
              },
              "thumbnailPath": {
                "deprecated": true,
                "description": "Filter by thumbnail file path",
                "type": "string"
              },
              "trashedAfter": {
                "deprecated": true,
                "description": "Filter by trash date (after)",
                "example": "2024-01-01T00:00:00.000Z",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                "type": "string"
              },
              "trashedBefore": {
                "deprecated": true,
                "description": "Filter by trash date (before)",
                "example": "2024-01-01T00:00:00.000Z",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                "type": "string"
              },
              "type": {
                "$ref": "#/components/schemas/AssetTypeEnum",
                "deprecated": true
              },
              "updatedAfter": {
                "deprecated": true,
                "description": "Filter by update date (after)",
                "example": "2024-01-01T00:00:00.000Z",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                "type": "string"
              },
              "updatedBefore": {
                "deprecated": true,
                "description": "Filter by update date (before)",
                "example": "2024-01-01T00:00:00.000Z",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                "type": "string"
              },
              "visibility": {
                "$ref": "#/components/schemas/AssetVisibility",
                "deprecated": true
              },
              "withDeleted": {
                "deprecated": true,
                "description": "Include deleted assets",
                "type": "boolean"
              },
              "withExif": {
                "description": "Include EXIF data in response",
                "type": "boolean"
              },
              "withPeople": {
                "description": "Include people data in response",
                "type": "boolean"
              },
              "withStacked": {
                "description": "Include stacked assets",
                "type": "boolean"
              }
            },
            "type": "object"
          },
          "mode": {
            "$ref": "#/components/schemas/SearchAskMode"
          },
          "normalizedQuery": {
            "description": "Normalized query text",
            "type": "string"
          }
        },
        "required": [
          "filters",
          "mode",
          "normalizedQuery"
        ],
        "type": "object"
      },
      "SearchAskMode": {
        "description": "Search mode used to answer the query",
        "enum": [
          "smart",
          "metadata"
        ],
        "type": "string"
      },
      "SearchOrder": {
        "properties": {
          "direction": {
            "$ref": "#/components/schemas/AssetOrder",
            "default": "desc"
          },
          "field": {
            "$ref": "#/components/schemas/SearchOrderField",
            "default": "fileCreatedAt"
          }
        },
        "type": "object"
      },
      "SearchOrderField": {
        "enum": [
          "fileCreatedAt",
          "localDateTime",
          "fileSizeInBytes",
          "rating"
        ],
        "type": "string"
      },
      "ImageEnrichmentFilter": {
        "description": "Filter by private image enrichment state",
        "enum": [
          "nsfw",
          "nsfw-review",
          "nsfw-reviewed",
          "nsfw-overridden",
          "image-description-failed",
          "nsfw-detection-failed",
          "missing-image-description",
          "missing-nsfw-detection"
        ],
        "type": "string"
      },
      "AskSearchDto": {
        "properties": {
          "language": {
            "description": "Search language code",
            "type": "string"
          },
          "page": {
            "description": "Page number",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "query": {
            "description": "Natural language Ask Search query",
            "minLength": 1,
            "type": "string"
          },
          "size": {
            "description": "Number of results to return",
            "maximum": 1000,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "SearchCityCountResponseDto": {
        "properties": {
          "city": {
            "description": "City name, grouped as in GET /search/cities (which lists only cities with a photo)",
            "type": "string"
          },
          "count": {
            "description": "Number of timeline photos and videos in this city",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "city",
          "count"
        ],
        "type": "object"
      },
      "SearchExploreResponseDto": {
        "properties": {
          "fieldName": {
            "description": "Explore field name",
            "type": "string"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/SearchExploreItem"
            },
            "type": "array"
          }
        },
        "required": [
          "fieldName",
          "items"
        ],
        "type": "object"
      },
      "SearchExploreItem": {
        "properties": {
          "data": {
            "$ref": "#/components/schemas/AssetResponseDto"
          },
          "value": {
            "description": "Explore value",
            "type": "string"
          }
        },
        "required": [
          "data",
          "value"
        ],
        "type": "object"
      },
      "SearchFacetsResponseDto": {
        "properties": {
          "facets": {
            "description": "Per facet, the most frequent values, busiest first. type, rating and isFavorite always add up to total; people, places, cameras, lenses and tags count assets that have a value",
            "items": {
              "$ref": "#/components/schemas/SearchFacetResponseDto"
            },
            "type": "array"
          },
          "total": {
            "description": "Number of assets the search body matches, as POST /search/statistics reports",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "facets",
          "total"
        ],
        "type": "object"
      },
      "SearchFacetsDto": {
        "properties": {
          "albumIds": {
            "deprecated": true,
            "description": "Filter by album IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "city": {
            "deprecated": true,
            "description": "Filter by city name",
            "nullable": true,
            "type": "string"
          },
          "country": {
            "deprecated": true,
            "description": "Filter by country name",
            "nullable": true,
            "type": "string"
          },
          "createdAfter": {
            "deprecated": true,
            "description": "Filter by creation date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "createdBefore": {
            "deprecated": true,
            "description": "Filter by creation date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "description": {
            "deprecated": true,
            "description": "Filter by description text",
            "type": "string"
          },
          "facetCovers": {
            "description": "Also return, per value, the newest matching asset (by capture time) as its cover",
            "type": "boolean"
          },
          "facetLimit": {
            "description": "Most frequent values per facet (default 10)",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "facets": {
            "description": "Facets to count, each once (repeats are ignored); every facet when omitted",
            "items": {
              "$ref": "#/components/schemas/SearchFacetField"
            },
            "maxItems": 10,
            "minItems": 1,
            "type": "array"
          },
          "filter": {
            "$ref": "#/components/schemas/SearchFilter"
          },
          "imageEnrichment": {
            "$ref": "#/components/schemas/ImageEnrichmentFilter"
          },
          "isEncoded": {
            "deprecated": true,
            "description": "Filter by encoded status",
            "type": "boolean"
          },
          "isFavorite": {
            "deprecated": true,
            "description": "Filter by favorite status",
            "type": "boolean"
          },
          "isMotion": {
            "deprecated": true,
            "description": "Filter by motion photo status",
            "type": "boolean"
          },
          "isNotInAlbum": {
            "deprecated": true,
            "description": "Filter assets not in any album",
            "type": "boolean"
          },
          "isOffline": {
            "deprecated": true,
            "description": "Filter by offline status",
            "type": "boolean"
          },
          "lensModel": {
            "deprecated": true,
            "description": "Filter by lens model",
            "nullable": true,
            "type": "string"
          },
          "libraryId": {
            "deprecated": true,
            "description": "Library ID to filter by",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "make": {
            "deprecated": true,
            "description": "Filter by camera make",
            "nullable": true,
            "type": "string"
          },
          "model": {
            "deprecated": true,
            "description": "Filter by camera model",
            "nullable": true,
            "type": "string"
          },
          "ocr": {
            "deprecated": true,
            "description": "Filter by OCR text content",
            "type": "string"
          },
          "personIds": {
            "deprecated": true,
            "description": "Filter by person IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "petIds": {
            "deprecated": true,
            "description": "Filter by the caller's own pet IDs (confirmed pet observations only)",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "rating": {
            "deprecated": true,
            "description": "Filter by rating [1-5], or null for unrated",
            "maximum": 5,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "state": {
            "deprecated": true,
            "description": "Filter by state/province name",
            "nullable": true,
            "type": "string"
          },
          "suppressedOnly": {
            "description": "Return only suppressed content. Requires an elevated session.",
            "type": "boolean"
          },
          "tagIds": {
            "deprecated": true,
            "description": "Filter by tag IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "takenAfter": {
            "deprecated": true,
            "description": "Filter by taken date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "takenBefore": {
            "deprecated": true,
            "description": "Filter by taken date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "trashedAfter": {
            "deprecated": true,
            "description": "Filter by trash date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "trashedBefore": {
            "deprecated": true,
            "description": "Filter by trash date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/AssetTypeEnum",
            "deprecated": true
          },
          "updatedAfter": {
            "deprecated": true,
            "description": "Filter by update date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "updatedBefore": {
            "deprecated": true,
            "description": "Filter by update date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "visibility": {
            "$ref": "#/components/schemas/AssetVisibility",
            "deprecated": true
          }
        },
        "type": "object"
      },
      "SearchFacetField": {
        "enum": [
          "people",
          "type",
          "city",
          "country",
          "make",
          "model",
          "lensModel",
          "rating",
          "isFavorite",
          "tags"
        ],
        "type": "string"
      },
      "SearchHistogramResponseDto": {
        "properties": {
          "buckets": {
            "description": "Non-empty buckets by local capture date, oldest first",
            "items": {
              "$ref": "#/components/schemas/SearchHistogramBucketDto"
            },
            "type": "array"
          },
          "granularity": {
            "$ref": "#/components/schemas/SearchHistogramGranularity"
          },
          "total": {
            "description": "Sum of every bucket; equals POST /search/statistics for the same body",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "buckets",
          "granularity",
          "total"
        ],
        "type": "object"
      },
      "SearchHistogramGranularity": {
        "enum": [
          "day",
          "month",
          "year"
        ],
        "type": "string"
      },
      "SearchHistogramBucketDto": {
        "properties": {
          "count": {
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "date": {
            "description": "First local capture date of the bucket (YYYY-MM-DD)",
            "format": "date",
            "type": "string"
          }
        },
        "required": [
          "count",
          "date"
        ],
        "type": "object"
      },
      "SearchHistogramDto": {
        "properties": {
          "albumIds": {
            "deprecated": true,
            "description": "Filter by album IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "city": {
            "deprecated": true,
            "description": "Filter by city name",
            "nullable": true,
            "type": "string"
          },
          "country": {
            "deprecated": true,
            "description": "Filter by country name",
            "nullable": true,
            "type": "string"
          },
          "createdAfter": {
            "deprecated": true,
            "description": "Filter by creation date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "createdBefore": {
            "deprecated": true,
            "description": "Filter by creation date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "description": {
            "deprecated": true,
            "description": "Filter by description text",
            "type": "string"
          },
          "filter": {
            "$ref": "#/components/schemas/SearchFilter"
          },
          "granularity": {
            "$ref": "#/components/schemas/SearchHistogramGranularity",
            "default": "month",
            "description": "Bucket size"
          },
          "imageEnrichment": {
            "$ref": "#/components/schemas/ImageEnrichmentFilter"
          },
          "isEncoded": {
            "deprecated": true,
            "description": "Filter by encoded status",
            "type": "boolean"
          },
          "isFavorite": {
            "deprecated": true,
            "description": "Filter by favorite status",
            "type": "boolean"
          },
          "isMotion": {
            "deprecated": true,
            "description": "Filter by motion photo status",
            "type": "boolean"
          },
          "isNotInAlbum": {
            "deprecated": true,
            "description": "Filter assets not in any album",
            "type": "boolean"
          },
          "isOffline": {
            "deprecated": true,
            "description": "Filter by offline status",
            "type": "boolean"
          },
          "lensModel": {
            "deprecated": true,
            "description": "Filter by lens model",
            "nullable": true,
            "type": "string"
          },
          "libraryId": {
            "deprecated": true,
            "description": "Library ID to filter by",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "make": {
            "deprecated": true,
            "description": "Filter by camera make",
            "nullable": true,
            "type": "string"
          },
          "model": {
            "deprecated": true,
            "description": "Filter by camera model",
            "nullable": true,
            "type": "string"
          },
          "ocr": {
            "deprecated": true,
            "description": "Filter by OCR text content",
            "type": "string"
          },
          "personIds": {
            "deprecated": true,
            "description": "Filter by person IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "petIds": {
            "deprecated": true,
            "description": "Filter by the caller's own pet IDs (confirmed pet observations only)",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "rating": {
            "deprecated": true,
            "description": "Filter by rating [1-5], or null for unrated",
            "maximum": 5,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "state": {
            "deprecated": true,
            "description": "Filter by state/province name",
            "nullable": true,
            "type": "string"
          },
          "suppressedOnly": {
            "description": "Return only suppressed content. Requires an elevated session.",
            "type": "boolean"
          },
          "tagIds": {
            "deprecated": true,
            "description": "Filter by tag IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "takenAfter": {
            "deprecated": true,
            "description": "Filter by taken date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "takenBefore": {
            "deprecated": true,
            "description": "Filter by taken date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "trashedAfter": {
            "deprecated": true,
            "description": "Filter by trash date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "trashedBefore": {
            "deprecated": true,
            "description": "Filter by trash date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/AssetTypeEnum",
            "deprecated": true
          },
          "updatedAfter": {
            "deprecated": true,
            "description": "Filter by update date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "updatedBefore": {
            "deprecated": true,
            "description": "Filter by update date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "visibility": {
            "$ref": "#/components/schemas/AssetVisibility",
            "deprecated": true
          }
        },
        "type": "object"
      },
      "MetadataSearchDto": {
        "properties": {
          "albumIds": {
            "deprecated": true,
            "description": "Filter by album IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "checksum": {
            "deprecated": true,
            "description": "Filter by file checksum",
            "type": "string"
          },
          "city": {
            "deprecated": true,
            "description": "Filter by city name",
            "nullable": true,
            "type": "string"
          },
          "country": {
            "deprecated": true,
            "description": "Filter by country name",
            "nullable": true,
            "type": "string"
          },
          "createdAfter": {
            "deprecated": true,
            "description": "Filter by creation date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "createdBefore": {
            "deprecated": true,
            "description": "Filter by creation date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "cursor": {
            "description": "Cursor for the next page of results",
            "minLength": 1,
            "type": "string"
          },
          "description": {
            "deprecated": true,
            "description": "Filter by description text",
            "type": "string"
          },
          "encodedVideoPath": {
            "deprecated": true,
            "description": "Filter by encoded video file path",
            "type": "string"
          },
          "filter": {
            "$ref": "#/components/schemas/SearchFilter"
          },
          "id": {
            "deprecated": true,
            "description": "Filter by asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "imageEnrichment": {
            "$ref": "#/components/schemas/ImageEnrichmentFilter"
          },
          "isEncoded": {
            "deprecated": true,
            "description": "Filter by encoded status",
            "type": "boolean"
          },
          "isFavorite": {
            "deprecated": true,
            "description": "Filter by favorite status",
            "type": "boolean"
          },
          "isMotion": {
            "deprecated": true,
            "description": "Filter by motion photo status",
            "type": "boolean"
          },
          "isNotInAlbum": {
            "deprecated": true,
            "description": "Filter assets not in any album",
            "type": "boolean"
          },
          "isOffline": {
            "deprecated": true,
            "description": "Filter by offline status",
            "type": "boolean"
          },
          "lensModel": {
            "deprecated": true,
            "description": "Filter by lens model",
            "nullable": true,
            "type": "string"
          },
          "libraryId": {
            "deprecated": true,
            "description": "Library ID to filter by",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "make": {
            "deprecated": true,
            "description": "Filter by camera make",
            "nullable": true,
            "type": "string"
          },
          "model": {
            "deprecated": true,
            "description": "Filter by camera model",
            "nullable": true,
            "type": "string"
          },
          "ocr": {
            "deprecated": true,
            "description": "Filter by OCR text content",
            "type": "string"
          },
          "order": {
            "$ref": "#/components/schemas/AssetOrder",
            "deprecated": true,
            "description": "Sort order"
          },
          "orderBy": {
            "$ref": "#/components/schemas/SearchOrder"
          },
          "originalFileName": {
            "deprecated": true,
            "description": "Filter by original file name",
            "type": "string"
          },
          "originalPath": {
            "deprecated": true,
            "description": "Filter by original file path",
            "type": "string"
          },
          "page": {
            "deprecated": true,
            "description": "Page number",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "personIds": {
            "deprecated": true,
            "description": "Filter by person IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "petIds": {
            "deprecated": true,
            "description": "Filter by the caller's own pet IDs (confirmed pet observations only)",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "previewPath": {
            "deprecated": true,
            "description": "Filter by preview file path",
            "type": "string"
          },
          "rating": {
            "deprecated": true,
            "description": "Filter by rating [1-5], or null for unrated",
            "maximum": 5,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "size": {
            "description": "Number of results to return",
            "maximum": 1000,
            "minimum": 1,
            "type": "integer"
          },
          "state": {
            "deprecated": true,
            "description": "Filter by state/province name",
            "nullable": true,
            "type": "string"
          },
          "suppressedOnly": {
            "description": "Return only suppressed content. Requires an elevated session.",
            "type": "boolean"
          },
          "tagIds": {
            "deprecated": true,
            "description": "Filter by tag IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "takenAfter": {
            "deprecated": true,
            "description": "Filter by taken date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "takenBefore": {
            "deprecated": true,
            "description": "Filter by taken date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "thumbnailPath": {
            "deprecated": true,
            "description": "Filter by thumbnail file path",
            "type": "string"
          },
          "trashedAfter": {
            "deprecated": true,
            "description": "Filter by trash date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "trashedBefore": {
            "deprecated": true,
            "description": "Filter by trash date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/AssetTypeEnum",
            "deprecated": true
          },
          "updatedAfter": {
            "deprecated": true,
            "description": "Filter by update date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "updatedBefore": {
            "deprecated": true,
            "description": "Filter by update date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "visibility": {
            "$ref": "#/components/schemas/AssetVisibility",
            "deprecated": true
          },
          "withDeleted": {
            "deprecated": true,
            "description": "Include deleted assets",
            "type": "boolean"
          },
          "withExif": {
            "description": "Include EXIF data in response",
            "type": "boolean"
          },
          "withPeople": {
            "description": "Include people data in response",
            "type": "boolean"
          },
          "withStacked": {
            "description": "Include stacked assets",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "PlacesResponseDto": {
        "properties": {
          "admin1name": {
            "description": "Administrative level 1 name (state/province)",
            "type": "string"
          },
          "admin2name": {
            "description": "Administrative level 2 name (county/district)",
            "type": "string"
          },
          "latitude": {
            "description": "Latitude coordinate",
            "format": "double",
            "type": "number"
          },
          "longitude": {
            "description": "Longitude coordinate",
            "format": "double",
            "type": "number"
          },
          "name": {
            "description": "Place name",
            "type": "string"
          }
        },
        "required": [
          "latitude",
          "longitude",
          "name"
        ],
        "type": "object"
      },
      "RandomSearchDto": {
        "properties": {
          "albumIds": {
            "deprecated": true,
            "description": "Filter by album IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "city": {
            "deprecated": true,
            "description": "Filter by city name",
            "nullable": true,
            "type": "string"
          },
          "country": {
            "deprecated": true,
            "description": "Filter by country name",
            "nullable": true,
            "type": "string"
          },
          "createdAfter": {
            "deprecated": true,
            "description": "Filter by creation date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "createdBefore": {
            "deprecated": true,
            "description": "Filter by creation date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "filter": {
            "$ref": "#/components/schemas/SearchFilter"
          },
          "imageEnrichment": {
            "$ref": "#/components/schemas/ImageEnrichmentFilter"
          },
          "isEncoded": {
            "deprecated": true,
            "description": "Filter by encoded status",
            "type": "boolean"
          },
          "isFavorite": {
            "deprecated": true,
            "description": "Filter by favorite status",
            "type": "boolean"
          },
          "isMotion": {
            "deprecated": true,
            "description": "Filter by motion photo status",
            "type": "boolean"
          },
          "isNotInAlbum": {
            "deprecated": true,
            "description": "Filter assets not in any album",
            "type": "boolean"
          },
          "isOffline": {
            "deprecated": true,
            "description": "Filter by offline status",
            "type": "boolean"
          },
          "lensModel": {
            "deprecated": true,
            "description": "Filter by lens model",
            "nullable": true,
            "type": "string"
          },
          "libraryId": {
            "deprecated": true,
            "description": "Library ID to filter by",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "make": {
            "deprecated": true,
            "description": "Filter by camera make",
            "nullable": true,
            "type": "string"
          },
          "model": {
            "deprecated": true,
            "description": "Filter by camera model",
            "nullable": true,
            "type": "string"
          },
          "ocr": {
            "deprecated": true,
            "description": "Filter by OCR text content",
            "type": "string"
          },
          "personIds": {
            "deprecated": true,
            "description": "Filter by person IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "petIds": {
            "deprecated": true,
            "description": "Filter by the caller's own pet IDs (confirmed pet observations only)",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "rating": {
            "deprecated": true,
            "description": "Filter by rating [1-5], or null for unrated",
            "maximum": 5,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "size": {
            "description": "Number of results to return",
            "maximum": 1000,
            "minimum": 1,
            "type": "integer"
          },
          "state": {
            "deprecated": true,
            "description": "Filter by state/province name",
            "nullable": true,
            "type": "string"
          },
          "suppressedOnly": {
            "description": "Return only suppressed content. Requires an elevated session.",
            "type": "boolean"
          },
          "tagIds": {
            "deprecated": true,
            "description": "Filter by tag IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "takenAfter": {
            "deprecated": true,
            "description": "Filter by taken date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "takenBefore": {
            "deprecated": true,
            "description": "Filter by taken date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "trashedAfter": {
            "deprecated": true,
            "description": "Filter by trash date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "trashedBefore": {
            "deprecated": true,
            "description": "Filter by trash date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/AssetTypeEnum",
            "deprecated": true
          },
          "updatedAfter": {
            "deprecated": true,
            "description": "Filter by update date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "updatedBefore": {
            "deprecated": true,
            "description": "Filter by update date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "visibility": {
            "$ref": "#/components/schemas/AssetVisibility",
            "deprecated": true
          },
          "withDeleted": {
            "deprecated": true,
            "description": "Include deleted assets",
            "type": "boolean"
          },
          "withExif": {
            "description": "Include EXIF data in response",
            "type": "boolean"
          },
          "withPeople": {
            "description": "Include people data in response",
            "type": "boolean"
          },
          "withStacked": {
            "description": "Include stacked assets",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "SmartSearchDto": {
        "properties": {
          "albumIds": {
            "deprecated": true,
            "description": "Filter by album IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "city": {
            "deprecated": true,
            "description": "Filter by city name",
            "nullable": true,
            "type": "string"
          },
          "country": {
            "deprecated": true,
            "description": "Filter by country name",
            "nullable": true,
            "type": "string"
          },
          "createdAfter": {
            "deprecated": true,
            "description": "Filter by creation date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "createdBefore": {
            "deprecated": true,
            "description": "Filter by creation date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "filter": {
            "$ref": "#/components/schemas/SearchFilter"
          },
          "imageEnrichment": {
            "$ref": "#/components/schemas/ImageEnrichmentFilter"
          },
          "isEncoded": {
            "deprecated": true,
            "description": "Filter by encoded status",
            "type": "boolean"
          },
          "isFavorite": {
            "deprecated": true,
            "description": "Filter by favorite status",
            "type": "boolean"
          },
          "isMotion": {
            "deprecated": true,
            "description": "Filter by motion photo status",
            "type": "boolean"
          },
          "isNotInAlbum": {
            "deprecated": true,
            "description": "Filter assets not in any album",
            "type": "boolean"
          },
          "isOffline": {
            "deprecated": true,
            "description": "Filter by offline status",
            "type": "boolean"
          },
          "language": {
            "description": "Search language code",
            "type": "string"
          },
          "lensModel": {
            "deprecated": true,
            "description": "Filter by lens model",
            "nullable": true,
            "type": "string"
          },
          "libraryId": {
            "deprecated": true,
            "description": "Library ID to filter by",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "make": {
            "deprecated": true,
            "description": "Filter by camera make",
            "nullable": true,
            "type": "string"
          },
          "model": {
            "deprecated": true,
            "description": "Filter by camera model",
            "nullable": true,
            "type": "string"
          },
          "ocr": {
            "deprecated": true,
            "description": "Filter by OCR text content",
            "type": "string"
          },
          "page": {
            "deprecated": true,
            "description": "Page number",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "personIds": {
            "deprecated": true,
            "description": "Filter by person IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "petIds": {
            "deprecated": true,
            "description": "Filter by the caller's own pet IDs (confirmed pet observations only)",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "query": {
            "description": "Natural language search query",
            "type": "string"
          },
          "queryAssetId": {
            "description": "Asset ID to use as search reference",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "rating": {
            "deprecated": true,
            "description": "Filter by rating [1-5], or null for unrated",
            "maximum": 5,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "size": {
            "description": "Number of results to return",
            "maximum": 1000,
            "minimum": 1,
            "type": "integer"
          },
          "state": {
            "deprecated": true,
            "description": "Filter by state/province name",
            "nullable": true,
            "type": "string"
          },
          "suppressedOnly": {
            "description": "Return only suppressed content. Requires an elevated session.",
            "type": "boolean"
          },
          "tagIds": {
            "deprecated": true,
            "description": "Filter by tag IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "takenAfter": {
            "deprecated": true,
            "description": "Filter by taken date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "takenBefore": {
            "deprecated": true,
            "description": "Filter by taken date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "trashedAfter": {
            "deprecated": true,
            "description": "Filter by trash date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "trashedBefore": {
            "deprecated": true,
            "description": "Filter by trash date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/AssetTypeEnum",
            "deprecated": true
          },
          "updatedAfter": {
            "deprecated": true,
            "description": "Filter by update date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "updatedBefore": {
            "deprecated": true,
            "description": "Filter by update date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "visibility": {
            "$ref": "#/components/schemas/AssetVisibility",
            "deprecated": true
          },
          "withDeleted": {
            "deprecated": true,
            "description": "Include deleted assets",
            "type": "boolean"
          },
          "withExif": {
            "description": "Include EXIF data in response",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "SmartSearchStatisticsResponseDto": {
        "properties": {
          "capped": {
            "description": "More than 1000 assets match; total is the cap",
            "type": "boolean"
          },
          "total": {
            "description": "Assets smart search would rank for this body, counted up to 1000",
            "maximum": 1000,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "capped",
          "total"
        ],
        "type": "object"
      },
      "SearchStatisticsResponseDto": {
        "properties": {
          "total": {
            "description": "Total number of matching assets",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "total"
        ],
        "type": "object"
      },
      "StatisticsSearchDto": {
        "properties": {
          "albumIds": {
            "deprecated": true,
            "description": "Filter by album IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "city": {
            "deprecated": true,
            "description": "Filter by city name",
            "nullable": true,
            "type": "string"
          },
          "country": {
            "deprecated": true,
            "description": "Filter by country name",
            "nullable": true,
            "type": "string"
          },
          "createdAfter": {
            "deprecated": true,
            "description": "Filter by creation date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "createdBefore": {
            "deprecated": true,
            "description": "Filter by creation date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "description": {
            "deprecated": true,
            "description": "Filter by description text",
            "type": "string"
          },
          "filter": {
            "$ref": "#/components/schemas/SearchFilter"
          },
          "imageEnrichment": {
            "$ref": "#/components/schemas/ImageEnrichmentFilter"
          },
          "isEncoded": {
            "deprecated": true,
            "description": "Filter by encoded status",
            "type": "boolean"
          },
          "isFavorite": {
            "deprecated": true,
            "description": "Filter by favorite status",
            "type": "boolean"
          },
          "isMotion": {
            "deprecated": true,
            "description": "Filter by motion photo status",
            "type": "boolean"
          },
          "isNotInAlbum": {
            "deprecated": true,
            "description": "Filter assets not in any album",
            "type": "boolean"
          },
          "isOffline": {
            "deprecated": true,
            "description": "Filter by offline status",
            "type": "boolean"
          },
          "lensModel": {
            "deprecated": true,
            "description": "Filter by lens model",
            "nullable": true,
            "type": "string"
          },
          "libraryId": {
            "deprecated": true,
            "description": "Library ID to filter by",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "make": {
            "deprecated": true,
            "description": "Filter by camera make",
            "nullable": true,
            "type": "string"
          },
          "model": {
            "deprecated": true,
            "description": "Filter by camera model",
            "nullable": true,
            "type": "string"
          },
          "ocr": {
            "deprecated": true,
            "description": "Filter by OCR text content",
            "type": "string"
          },
          "personIds": {
            "deprecated": true,
            "description": "Filter by person IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "petIds": {
            "deprecated": true,
            "description": "Filter by the caller's own pet IDs (confirmed pet observations only)",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "rating": {
            "deprecated": true,
            "description": "Filter by rating [1-5], or null for unrated",
            "maximum": 5,
            "minimum": 1,
            "nullable": true,
            "type": "integer"
          },
          "state": {
            "deprecated": true,
            "description": "Filter by state/province name",
            "nullable": true,
            "type": "string"
          },
          "suppressedOnly": {
            "description": "Return only suppressed content. Requires an elevated session.",
            "type": "boolean"
          },
          "tagIds": {
            "deprecated": true,
            "description": "Filter by tag IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "takenAfter": {
            "deprecated": true,
            "description": "Filter by taken date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "takenBefore": {
            "deprecated": true,
            "description": "Filter by taken date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "trashedAfter": {
            "deprecated": true,
            "description": "Filter by trash date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "trashedBefore": {
            "deprecated": true,
            "description": "Filter by trash date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/AssetTypeEnum",
            "deprecated": true
          },
          "updatedAfter": {
            "deprecated": true,
            "description": "Filter by update date (after)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "updatedBefore": {
            "deprecated": true,
            "description": "Filter by update date (before)",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "visibility": {
            "$ref": "#/components/schemas/AssetVisibility",
            "deprecated": true
          }
        },
        "type": "object"
      },
      "SearchSuggestionType": {
        "description": "Suggestion type",
        "enum": [
          "country",
          "state",
          "city",
          "camera-make",
          "camera-model",
          "camera-lens-model"
        ],
        "type": "string"
      },
      "ServerApkLinksDto": {
        "properties": {
          "arm64v8a": {
            "description": "APK download link for ARM64 v8a architecture",
            "type": "string"
          },
          "armeabiv7a": {
            "description": "APK download link for ARM EABI v7a architecture",
            "type": "string"
          },
          "universal": {
            "description": "APK download link for universal architecture",
            "type": "string"
          },
          "x86_64": {
            "description": "APK download link for x86_64 architecture",
            "type": "string"
          }
        },
        "required": [
          "arm64v8a",
          "armeabiv7a",
          "universal",
          "x86_64"
        ],
        "type": "object"
      },
      "ServerAppReleasesResponseDto": {
        "properties": {
          "android": {
            "description": "Android application",
            "properties": {
              "appId": {
                "description": "Android package id of the signed release",
                "type": "string"
              },
              "available": {
                "description": "Whether a signed Android release is configured for this server",
                "type": "boolean"
              },
              "links": {
                "$ref": "#/components/schemas/ServerApkLinksDto",
                "description": "Signed APK downloads for this server version"
              },
              "signingCertificateSha256": {
                "description": "SHA-256 fingerprint of the release signing certificate, as AA:BB:...",
                "type": "string"
              },
              "storeUrl": {
                "description": "Store listing of the Android app, when the operator configured one ()",
                "type": "string"
              }
            },
            "required": [
              "available"
            ],
            "type": "object"
          },
          "ios": {
            "description": "iOS application",
            "properties": {
              "available": {
                "description": "Whether an iOS release is configured for this server",
                "type": "boolean"
              },
              "url": {
                "description": "App Store or TestFlight page",
                "type": "string"
              }
            },
            "required": [
              "available"
            ],
            "type": "object"
          }
        },
        "required": [
          "android",
          "ios"
        ],
        "type": "object"
      },
      "LibrarySetupStatusDto": {
        "properties": {
          "canFinish": {
            "type": "boolean"
          },
          "installation": {
            "type": "string"
          },
          "origin": {
            "enum": [
              "new_import",
              "new_library",
              "restored_library"
            ],
            "type": "string"
          },
          "phase": {
            "enum": [
              "awaiting-account",
              "rescanning",
              "verifying",
              "needs-attention",
              "complete"
            ],
            "type": "string"
          },
          "regeneration": {
            "nullable": true,
            "properties": {
              "blocked": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "completed": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "failed": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "needsAttention": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "preparedAt": {
                "nullable": true,
                "type": "string"
              },
              "reasons": {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              "runId": {
                "format": "uuid",
                "nullable": true,
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                "type": "string"
              },
              "startedAt": {
                "nullable": true,
                "type": "string"
              },
              "state": {
                "type": "string"
              },
              "total": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              }
            },
            "required": [
              "runId",
              "state",
              "preparedAt",
              "startedAt",
              "completed",
              "total",
              "failed",
              "blocked",
              "needsAttention",
              "reasons"
            ],
            "type": "object"
          },
          "rescanComplete": {
            "type": "boolean"
          },
          "revision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "setupRequired": {
            "type": "boolean"
          },
          "sync": {
            "properties": {
              "authenticated": {
                "type": "boolean"
              },
              "catalogComplete": {
                "type": "boolean"
              },
              "previewsReady": {
                "type": "boolean"
              }
            },
            "required": [
              "authenticated",
              "catalogComplete",
              "previewsReady"
            ],
            "type": "object"
          },
          "verificationPassed": {
            "type": "boolean"
          }
        },
        "required": [
          "canFinish",
          "installation",
          "origin",
          "phase",
          "rescanComplete",
          "revision",
          "setupRequired",
          "sync",
          "verificationPassed"
        ],
        "type": "object"
      },
      "FinishLibrarySetupDto": {
        "additionalProperties": false,
        "properties": {
          "previewsReady": {
            "enum": [
              true
            ],
            "type": "boolean"
          },
          "receipt": {
            "pattern": "^[a-f0-9]{64}$",
            "type": "string"
          },
          "revision": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          }
        },
        "required": [
          "previewsReady",
          "receipt",
          "revision"
        ],
        "type": "object"
      },
      "ServerMediaTypesResponseDto": {
        "properties": {
          "image": {
            "description": "Supported image MIME types",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "sidecar": {
            "description": "Supported sidecar MIME types",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "video": {
            "description": "Supported video MIME types",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "image",
          "sidecar",
          "video"
        ],
        "type": "object"
      },
      "ServerStatsResponseDto": {
        "properties": {
          "photos": {
            "description": "Total number of photos",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "usage": {
            "description": "Total storage usage in bytes",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "usageByUser": {
            "description": "Array of usage for each user",
            "items": {
              "$ref": "#/components/schemas/UsageByUserDto"
            },
            "type": "array"
          },
          "usagePhotos": {
            "description": "Storage usage for photos in bytes",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "usageVideos": {
            "description": "Storage usage for videos in bytes",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "videos": {
            "description": "Total number of videos",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "photos",
          "usage",
          "usageByUser",
          "usagePhotos",
          "usageVideos",
          "videos"
        ],
        "type": "object"
      },
      "UsageByUserDto": {
        "properties": {
          "photos": {
            "description": "Number of photos",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "quotaSizeInBytes": {
            "description": "User quota size in bytes (null if unlimited)",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "usage": {
            "description": "Total storage usage in bytes",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "usagePhotos": {
            "description": "Storage usage for photos in bytes",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "usageVideos": {
            "description": "Storage usage for videos in bytes",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "userId": {
            "description": "User ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "userName": {
            "description": "User name",
            "type": "string"
          },
          "videos": {
            "description": "Number of videos",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "photos",
          "quotaSizeInBytes",
          "usage",
          "usagePhotos",
          "usageVideos",
          "userId",
          "userName",
          "videos"
        ],
        "type": "object"
      },
      "ServerStorageResponseDto": {
        "properties": {
          "diskAvailable": {
            "description": "Available disk space (human-readable format)",
            "type": "string"
          },
          "diskAvailableRaw": {
            "description": "Available disk space in bytes",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "diskSize": {
            "description": "Total disk size (human-readable format)",
            "type": "string"
          },
          "diskSizeRaw": {
            "description": "Total disk size in bytes",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "diskUsagePercentage": {
            "description": "Disk usage percentage (0-100)",
            "format": "double",
            "type": "number"
          },
          "diskUse": {
            "description": "Used disk space (human-readable format)",
            "type": "string"
          },
          "diskUseRaw": {
            "description": "Used disk space in bytes",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "diskAvailable",
          "diskAvailableRaw",
          "diskSize",
          "diskSizeRaw",
          "diskUsagePercentage",
          "diskUse",
          "diskUseRaw"
        ],
        "type": "object"
      },
      "ServerVersionResponseDto": {
        "properties": {
          "major": {
            "description": "Major version number",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "minor": {
            "description": "Minor version number",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "patch": {
            "description": "Patch version number",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "prerelease": {
            "description": "Pre-release version number",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "prereleaseName": {
            "description": "Full pre-release identifier (for example rc.1 or beta.2), present only for a pre-release ()",
            "type": "string"
          }
        },
        "required": [
          "major",
          "minor",
          "patch",
          "prerelease"
        ],
        "type": "object"
      },
      "VersionCheckStateResponseDto": {
        "properties": {
          "checkedAt": {
            "description": "Last check timestamp",
            "nullable": true,
            "type": "string"
          },
          "releaseVersion": {
            "description": "Release version",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "checkedAt",
          "releaseVersion"
        ],
        "type": "object"
      },
      "ReleaseEventV1": {
        "properties": {
          "checkedAt": {
            "description": "When the server last checked for a latest version. As an ISO timestamp",
            "type": "string"
          },
          "isAvailable": {
            "description": "Whether a new version is available",
            "type": "boolean"
          },
          "releaseVersion": {
            "$ref": "#/components/schemas/ServerVersionResponseDto"
          },
          "serverVersion": {
            "$ref": "#/components/schemas/ServerVersionResponseDto"
          },
          "type": {
            "$ref": "#/components/schemas/ReleaseType",
            "description": "Release type",
            "nullable": true
          }
        },
        "required": [
          "checkedAt",
          "isAvailable",
          "releaseVersion",
          "serverVersion",
          "type"
        ],
        "type": "object"
      },
      "ReleaseType": {
        "enum": [
          "major",
          "premajor",
          "minor",
          "preminor",
          "patch",
          "prepatch",
          "prerelease"
        ],
        "type": "string"
      },
      "ServerVersionHistoryResponseDto": {
        "properties": {
          "createdAt": {
            "description": "When this version was first seen",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "id": {
            "description": "Version history entry ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "version": {
            "description": "Version string",
            "type": "string"
          }
        },
        "required": [
          "createdAt",
          "id",
          "version"
        ],
        "type": "object"
      },
      "SessionCreateResponseDto": {
        "properties": {
          "appVersion": {
            "description": "App version",
            "nullable": true,
            "type": "string"
          },
          "createdAt": {
            "description": "Creation date",
            "type": "string"
          },
          "current": {
            "description": "Is current session",
            "type": "boolean"
          },
          "deviceOS": {
            "description": "Device OS",
            "type": "string"
          },
          "deviceType": {
            "description": "Device type",
            "type": "string"
          },
          "expiresAt": {
            "description": "Expiration date",
            "type": "string"
          },
          "id": {
            "description": "Session ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isPendingSyncReset": {
            "description": "Is pending sync reset",
            "type": "boolean"
          },
          "token": {
            "description": "Session token",
            "type": "string"
          },
          "updatedAt": {
            "description": "Last update date",
            "type": "string"
          }
        },
        "required": [
          "appVersion",
          "createdAt",
          "current",
          "deviceOS",
          "deviceType",
          "id",
          "isPendingSyncReset",
          "token",
          "updatedAt"
        ],
        "type": "object"
      },
      "SessionCreateDto": {
        "properties": {
          "deviceOS": {
            "description": "Device OS",
            "type": "string"
          },
          "deviceType": {
            "description": "Device type",
            "type": "string"
          },
          "duration": {
            "description": "Session duration in seconds",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          }
        },
        "type": "object"
      },
      "SessionUpdateDto": {
        "properties": {
          "isPendingSyncReset": {
            "description": "Reset pending sync state",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "SharedLinkResponseDto": {
        "description": "Shared link response",
        "properties": {
          "album": {
            "$ref": "#/components/schemas/AlbumResponseDto"
          },
          "allowDownload": {
            "description": "Allow downloads",
            "type": "boolean"
          },
          "allowUpload": {
            "description": "Allow uploads",
            "type": "boolean"
          },
          "assets": {
            "items": {
              "$ref": "#/components/schemas/AssetResponseDto"
            },
            "type": "array"
          },
          "createdAt": {
            "description": "Creation date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "description": {
            "description": "Link description",
            "nullable": true,
            "type": "string"
          },
          "expiresAt": {
            "description": "Expiration date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "id": {
            "description": "Shared link ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "key": {
            "description": "Encryption key (base64url)",
            "type": "string"
          },
          "owner": {
            "$ref": "#/components/schemas/SharedLinkOwnerResponseDto",
            "description": "Display name of the user who created the link, for \"Shared by\" on the public page"
          },
          "password": {
            "description": "Has password: a fixed mask when the link has one, never the password itself",
            "nullable": true,
            "type": "string"
          },
          "showMetadata": {
            "description": "Show metadata",
            "type": "boolean"
          },
          "slug": {
            "description": "Custom URL slug",
            "nullable": true,
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/SharedLinkType"
          },
          "url": {
            "description": "The link's public address: the server's external domain, then /s/<slug> (URL-encoded) or /share/<key>. Null when no external domain is set; a client then puts the same path after the address it uses.",
            "nullable": true,
            "type": "string"
          },
          "userId": {
            "description": "Owner user ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "allowDownload",
          "allowUpload",
          "assets",
          "createdAt",
          "description",
          "expiresAt",
          "id",
          "key",
          "password",
          "showMetadata",
          "slug",
          "type",
          "url",
          "userId"
        ],
        "type": "object"
      },
      "SharedLinkType": {
        "description": "Shared link type",
        "enum": [
          "ALBUM",
          "INDIVIDUAL"
        ],
        "type": "string"
      },
      "SharedLinkOwnerResponseDto": {
        "description": "Public details of the shared link owner",
        "properties": {
          "name": {
            "description": "Display name of the user who created the link",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "SharedLinkCreateDto": {
        "properties": {
          "albumId": {
            "description": "Album ID (for album sharing)",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "allowDownload": {
            "default": true,
            "description": "Allow downloads",
            "type": "boolean"
          },
          "allowUpload": {
            "description": "Allow uploads",
            "type": "boolean"
          },
          "assetIds": {
            "description": "Asset IDs (for individual assets)",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "description": {
            "description": "Link description",
            "nullable": true,
            "type": "string"
          },
          "expiresAt": {
            "description": "Expiration date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "password": {
            "description": "Link password",
            "nullable": true,
            "type": "string"
          },
          "showMetadata": {
            "default": true,
            "description": "Show metadata",
            "type": "boolean"
          },
          "slug": {
            "description": "Custom URL slug",
            "nullable": true,
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/SharedLinkType"
          }
        },
        "required": [
          "type"
        ],
        "type": "object"
      },
      "SharedLinkEditDto": {
        "properties": {
          "allowDownload": {
            "description": "Allow downloads",
            "type": "boolean"
          },
          "allowUpload": {
            "description": "Allow uploads",
            "type": "boolean"
          },
          "description": {
            "description": "Link description",
            "nullable": true,
            "type": "string"
          },
          "expiresAt": {
            "description": "Expiration date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "password": {
            "description": "Link password",
            "nullable": true,
            "type": "string"
          },
          "showMetadata": {
            "description": "Show metadata",
            "type": "boolean"
          },
          "slug": {
            "description": "Custom URL slug",
            "nullable": true,
            "type": "string"
          }
        },
        "type": "object"
      },
      "AssetIdsResponseDto": {
        "properties": {
          "assetId": {
            "description": "Asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "error": {
            "$ref": "#/components/schemas/AssetIdErrorReason"
          },
          "success": {
            "description": "Whether operation succeeded",
            "type": "boolean"
          }
        },
        "required": [
          "assetId",
          "success"
        ],
        "type": "object"
      },
      "AssetIdErrorReason": {
        "description": "Error reason if failed",
        "enum": [
          "duplicate",
          "no_permission",
          "not_found"
        ],
        "type": "string"
      },
      "AssetIdsDto": {
        "properties": {
          "assetIds": {
            "description": "Asset IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "assetIds"
        ],
        "type": "object"
      },
      "SharedSpacePreviewResponseDto": {
        "properties": {
          "accepted": {
            "description": "True once the recipient has joined the space",
            "type": "boolean"
          },
          "albumName": {
            "description": "Shared space name",
            "type": "string"
          },
          "assetCount": {
            "description": "Items the recipient would see. Media marked sensitive, and Locked media, are not counted.",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "description": {
            "description": "Shared space description",
            "type": "string"
          },
          "endDate": {
            "description": "Latest item date, sensitive and Locked media excluded",
            "format": "date-time",
            "type": "string"
          },
          "icon": {
            "description": "Icon: a Material Design Icons name (null = default icon)",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "Shared space ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "invitedAt": {
            "description": "When the invitation was sent",
            "format": "date-time",
            "type": "string"
          },
          "invitedBy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/UserResponseDto"
              }
            ],
            "description": "Who sent the invitation",
            "nullable": true
          },
          "memberCount": {
            "description": "People already in the shared space, including its owner",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "owner": {
            "$ref": "#/components/schemas/UserResponseDto",
            "description": "Who owns the shared space"
          },
          "role": {
            "$ref": "#/components/schemas/AlbumUserRole",
            "description": "The role the recipient gets on accept"
          },
          "startDate": {
            "description": "Earliest item date, sensitive and Locked media excluded",
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "accepted",
          "albumName",
          "assetCount",
          "description",
          "icon",
          "id",
          "invitedAt",
          "invitedBy",
          "memberCount",
          "owner",
          "role"
        ],
        "type": "object"
      },
      "RecipientGroupResponseDto": {
        "properties": {
          "createdAt": {
            "description": "When the group was saved",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "Recipient group ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "name": {
            "description": "Name, visible to its owner only",
            "type": "string"
          },
          "updatedAt": {
            "description": "When the group last changed",
            "format": "date-time",
            "type": "string"
          },
          "users": {
            "description": "People in the group who still have an account, by name",
            "items": {
              "$ref": "#/components/schemas/UserResponseDto"
            },
            "type": "array"
          }
        },
        "required": [
          "createdAt",
          "id",
          "name",
          "updatedAt",
          "users"
        ],
        "type": "object"
      },
      "RecipientGroupCreateDto": {
        "properties": {
          "name": {
            "description": "Name, visible to its owner only",
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "userIds": {
            "description": "People in the group. Yourself and repeats are dropped.",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 200,
            "type": "array"
          }
        },
        "required": [
          "name",
          "userIds"
        ],
        "type": "object"
      },
      "RecipientGroupUpdateDto": {
        "properties": {
          "name": {
            "description": "Name, visible to its owner only",
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "userIds": {
            "description": "People in the group. Yourself and repeats are dropped.",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 200,
            "type": "array"
          }
        },
        "type": "object"
      },
      "SharedSpaceActivityResponseDto": {
        "properties": {
          "events": {
            "description": "Newest first",
            "items": {
              "$ref": "#/components/schemas/SharedSpaceEventResponseDto"
            },
            "type": "array"
          },
          "hasMore": {
            "description": "True when older events exist beyond this page",
            "type": "boolean"
          },
          "lastVisitedAt": {
            "description": "When this member last marked the shared space seen; null if they never have",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "unreadCount": {
            "description": "Events by other members since then that this member may see. Capped at 500.",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "events",
          "hasMore",
          "lastVisitedAt",
          "unreadCount"
        ],
        "type": "object"
      },
      "SharedSpaceEventResponseDto": {
        "properties": {
          "activityId": {
            "description": "The comment or like this event announces, if any",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "actor": {
            "allOf": [
              {
                "$ref": "#/components/schemas/UserResponseDto"
              }
            ],
            "description": "Who did it; null once that account is gone",
            "nullable": true
          },
          "assetCount": {
            "description": "How many of the items this event is about the reader may see",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "assetIds": {
            "description": "The items this event is about that the reader may see and that are still in the shared space. Empty for a removal.",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "comment": {
            "description": "The comment text, for a comment or reply event. Mentions are @{userId} tokens.",
            "nullable": true,
            "type": "string"
          },
          "createdAt": {
            "description": "When it happened",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "Event ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "mentions": {
            "description": "Members named in the comment",
            "items": {
              "$ref": "#/components/schemas/UserResponseDto"
            },
            "type": "array"
          },
          "subject": {
            "description": "A linked album's or person's name as the space knew it, or the new role; null otherwise",
            "nullable": true,
            "type": "string"
          },
          "targetUser": {
            "allOf": [
              {
                "$ref": "#/components/schemas/UserResponseDto"
              }
            ],
            "description": "The member a member event is about, or the author of the comment a reply answers; null otherwise",
            "nullable": true
          },
          "type": {
            "$ref": "#/components/schemas/SharedSpaceEventType"
          }
        },
        "required": [
          "activityId",
          "actor",
          "assetCount",
          "assetIds",
          "comment",
          "createdAt",
          "id",
          "mentions",
          "subject",
          "targetUser",
          "type"
        ],
        "type": "object"
      },
      "SharedSpaceEventType": {
        "description": "Shared space event type",
        "enum": [
          "AssetsAdded",
          "AssetsRemoved",
          "AlbumLinked",
          "AlbumUnlinked",
          "PersonLinked",
          "PersonUnlinked",
          "MemberJoined",
          "MemberLeft",
          "MemberRemoved",
          "MemberRoleChanged",
          "Comment",
          "Reply",
          "Like"
        ],
        "type": "string"
      },
      "SharedSpaceAlbumsResponseDto": {
        "properties": {
          "albums": {
            "description": "Albums linked into the shared space, by name",
            "items": {
              "$ref": "#/components/schemas/SharedSpaceAlbumResponseDto"
            },
            "type": "array"
          }
        },
        "required": [
          "albums"
        ],
        "type": "object"
      },
      "SharedSpaceAlbumResponseDto": {
        "properties": {
          "albumName": {
            "description": "The linked album name",
            "type": "string"
          },
          "assetCount": {
            "description": "Items that are in both this album and the shared space. Media marked sensitive, and Locked media, are not counted.",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "canUnlink": {
            "description": "True when the caller may remove this link",
            "type": "boolean"
          },
          "icon": {
            "description": "Icon: a Material Design Icons name (null = default icon)",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "The linked album ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "linkedAt": {
            "description": "When the album was linked",
            "format": "date-time",
            "type": "string"
          },
          "linkedBy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/UserResponseDto"
              }
            ],
            "description": "The member who linked this album",
            "nullable": true
          },
          "thumbnailAssetId": {
            "description": "An item that is already in the shared space, used as the tile picture",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "albumName",
          "assetCount",
          "canUnlink",
          "icon",
          "id",
          "linkedAt",
          "linkedBy",
          "thumbnailAssetId"
        ],
        "type": "object"
      },
      "SharedSpaceCommentsResponseDto": {
        "properties": {
          "comments": {
            "description": "Oldest first",
            "items": {
              "$ref": "#/components/schemas/SharedSpaceCommentResponseDto"
            },
            "type": "array"
          }
        },
        "required": [
          "comments"
        ],
        "type": "object"
      },
      "SharedSpaceCommentResponseDto": {
        "properties": {
          "assetId": {
            "description": "The item commented on; null for a comment on the space itself",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "canDelete": {
            "description": "True when the caller may remove the comment",
            "type": "boolean"
          },
          "canEdit": {
            "description": "True when the caller may change the text",
            "type": "boolean"
          },
          "comment": {
            "description": "The text, with @{userId} mention tokens",
            "type": "string"
          },
          "createdAt": {
            "description": "When it was written",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "Comment ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "mentions": {
            "description": "Members named in the comment",
            "items": {
              "$ref": "#/components/schemas/UserResponseDto"
            },
            "type": "array"
          },
          "parentId": {
            "description": "The top-level comment this reply answers; null for a top-level comment",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "replyCount": {
            "description": "How many replies this comment has that the caller can see; always 0 for a reply",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "updatedAt": {
            "description": "When it was last edited",
            "format": "date-time",
            "type": "string"
          },
          "user": {
            "$ref": "#/components/schemas/UserResponseDto",
            "description": "The author"
          }
        },
        "required": [
          "assetId",
          "canDelete",
          "canEdit",
          "comment",
          "createdAt",
          "id",
          "mentions",
          "parentId",
          "replyCount",
          "updatedAt",
          "user"
        ],
        "type": "object"
      },
      "SharedSpaceCommentCreateDto": {
        "properties": {
          "assetId": {
            "description": "The item to comment on. Left out, the comment is on the space itself.",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "comment": {
            "description": "The text. Mention a member with @{userId}; every mention must name a current member.",
            "maxLength": 4000,
            "minLength": 1,
            "type": "string"
          },
          "parentId": {
            "description": "Reply to this comment. Replying to a reply joins the same thread, under its top-level comment. A reply is on the same item as the comment it answers.",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "comment"
        ],
        "type": "object"
      },
      "SharedSpaceCommentUpdateDto": {
        "properties": {
          "comment": {
            "description": "The text. Mention a member with @{userId}; every mention must name a current member.",
            "maxLength": 4000,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "comment"
        ],
        "type": "object"
      },
      "SharedSpaceMembersResponseDto": {
        "properties": {
          "members": {
            "description": "Members and pending invitations, owner first",
            "items": {
              "$ref": "#/components/schemas/SharedSpaceMemberResponseDto"
            },
            "type": "array"
          }
        },
        "required": [
          "members"
        ],
        "type": "object"
      },
      "SharedSpaceMemberResponseDto": {
        "properties": {
          "invitedAt": {
            "description": "When a pending invitation was sent",
            "format": "date-time",
            "type": "string"
          },
          "pending": {
            "description": "True while the invitation has not been accepted",
            "type": "boolean"
          },
          "role": {
            "$ref": "#/components/schemas/AlbumUserRole"
          },
          "user": {
            "$ref": "#/components/schemas/UserResponseDto"
          }
        },
        "required": [
          "pending",
          "role",
          "user"
        ],
        "type": "object"
      },
      "SharedSpaceNewResponseDto": {
        "properties": {
          "assetCount": {
            "description": "Items other members added since then",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "assetIds": {
            "description": "Up to 500 of those items, so the timeline can show exactly what is new",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "lastVisitedAt": {
            "description": "When this member last marked the shared space seen; null if they never have",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "assetCount",
          "assetIds",
          "lastVisitedAt"
        ],
        "type": "object"
      },
      "SharedSpacePeopleResponseDto": {
        "properties": {
          "candidates": {
            "description": "People of the caller's own that appear in the shared space and are not linked yet. Only the caller's own people are ever listed here.",
            "items": {
              "$ref": "#/components/schemas/PersonResponseDto"
            },
            "type": "array"
          },
          "linked": {
            "description": "People published into the shared space",
            "items": {
              "$ref": "#/components/schemas/SharedSpacePersonResponseDto"
            },
            "type": "array"
          }
        },
        "required": [
          "candidates",
          "linked"
        ],
        "type": "object"
      },
      "SharedSpacePersonResponseDto": {
        "properties": {
          "assetCount": {
            "description": "Items in the shared space that show this person. Media marked sensitive, and Locked media, are not counted.",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "canUnlink": {
            "description": "True when the caller may remove this link",
            "type": "boolean"
          },
          "coverAssetId": {
            "description": "An item already in the shared space that shows this person, used as the tile picture",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "id": {
            "description": "The link ID. Not a person ID: a person is never disclosed across a space.",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "linkedAt": {
            "description": "When the person was linked",
            "format": "date-time",
            "type": "string"
          },
          "linkedBy": {
            "$ref": "#/components/schemas/UserResponseDto",
            "description": "The member who linked this person"
          },
          "name": {
            "description": "The name this shared space uses, independent of the owner's own name for them",
            "type": "string"
          }
        },
        "required": [
          "assetCount",
          "canUnlink",
          "coverAssetId",
          "id",
          "linkedAt",
          "linkedBy",
          "name"
        ],
        "type": "object"
      },
      "SharedSpacePersonLinkDto": {
        "properties": {
          "name": {
            "description": "The name the shared space will use. Defaults to the caller's own name for them.",
            "maxLength": 255,
            "type": "string"
          },
          "personId": {
            "description": "A person of the caller's own to publish into the shared space",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "personId"
        ],
        "type": "object"
      },
      "StackResponseDto": {
        "description": "Stack response",
        "properties": {
          "assets": {
            "items": {
              "$ref": "#/components/schemas/AssetResponseDto"
            },
            "type": "array"
          },
          "id": {
            "description": "Stack ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "primaryAssetId": {
            "description": "Primary asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "assets",
          "id",
          "primaryAssetId"
        ],
        "type": "object"
      },
      "StackCreateDto": {
        "properties": {
          "assetIds": {
            "description": "Asset IDs (first becomes primary, min 2)",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "minItems": 2,
            "type": "array"
          }
        },
        "required": [
          "assetIds"
        ],
        "type": "object"
      },
      "StackUpdateDto": {
        "properties": {
          "primaryAssetId": {
            "description": "Primary asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "StudioBundleUploadDto": {
        "properties": {
          "consumedAt": {
            "description": "When an import first read it",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "digest": {
            "description": "SHA-256 of the whole file",
            "type": "string"
          },
          "engineRevision": {
            "type": "string"
          },
          "expiresAt": {
            "description": "When the upload is discarded",
            "format": "date-time",
            "type": "string"
          },
          "exportedAt": {
            "format": "date-time",
            "type": "string"
          },
          "fileName": {
            "description": "The file name as uploaded",
            "type": "string"
          },
          "id": {
            "description": "Upload ID, used to start an import",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "producerVersion": {
            "type": "string"
          },
          "projectName": {
            "type": "string"
          },
          "revision": {
            "description": "The revision the bundle was made from",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "sizeBytes": {
            "type": "string"
          },
          "sources": {
            "items": {
              "$ref": "#/components/schemas/StudioBundleSourceDto"
            },
            "type": "array"
          }
        },
        "required": [
          "consumedAt",
          "digest",
          "engineRevision",
          "expiresAt",
          "exportedAt",
          "fileName",
          "id",
          "producerVersion",
          "projectName",
          "revision",
          "sizeBytes",
          "sources"
        ],
        "type": "object"
      },
      "StudioBundleSourceDto": {
        "properties": {
          "contentType": {
            "nullable": true,
            "type": "string"
          },
          "fileName": {
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "Identifier on the exporting server",
            "type": "string"
          },
          "key": {
            "description": "Mapping key for the import request",
            "type": "string"
          },
          "kind": {
            "description": "`library-asset`, `edited-master` or `project-import` (a file kept with the project)",
            "type": "string"
          },
          "mode": {
            "$ref": "#/components/schemas/StudioBundleSourceMode"
          },
          "resolution": {
            "$ref": "#/components/schemas/StudioBundleSourceResolution"
          },
          "sizeBytes": {
            "description": "Size of the source file, when the exporting server knew it",
            "nullable": true,
            "type": "string"
          },
          "suggestedAssetId": {
            "description": "An asset of yours with the same content",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "contentType",
          "fileName",
          "id",
          "key",
          "kind",
          "mode",
          "resolution",
          "sizeBytes",
          "suggestedAssetId"
        ],
        "type": "object"
      },
      "StudioBundleSourceResolution": {
        "description": "`kept`: the original is already available to you; `suggested`: an item of yours has the same content; `missing`: choose one or import without it",
        "enum": [
          "kept",
          "suggested",
          "missing"
        ],
        "type": "string"
      },
      "StudioBundleSourceMode": {
        "description": "`embedded` carries a verified copy; `reference` names media on the exporting server",
        "enum": [
          "embedded",
          "reference"
        ],
        "type": "string"
      },
      "StudioBundleUploadCreateDto": {
        "properties": {
          "file": {
            "description": "A `.frameleaf-studio.zip` bundle",
            "format": "binary",
            "type": "string"
          }
        },
        "required": [
          "file"
        ],
        "type": "object"
      },
      "StudioPreviewStreamDto": {
        "properties": {
          "bounds": {
            "$ref": "#/components/schemas/StudioPreviewStreamBoundsDto"
          },
          "closeReason": {
            "allOf": [
              {
                "$ref": "#/components/schemas/StudioPreviewStreamCloseReason"
              }
            ],
            "nullable": true
          },
          "currentRevision": {
            "description": "The stored head, when the session closed as stale",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "expiresAt": {
            "description": "The hard end of this session",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "Stream session ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "keepaliveMs": {
            "description": "Poll at least this often, or the session is closed",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "negotiation": {
            "description": "The offer/answer round; an answer must name it",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "offer": {
            "description": "The worker's offer for this round, while it waits for an answer",
            "maxLength": 65536,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          },
          "projectId": {
            "type": "string"
          },
          "revision": {
            "description": "The stored project revision this session plays",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "start": {
            "$ref": "#/components/schemas/StudioPreviewTimeDto",
            "description": "Where playback starts"
          },
          "state": {
            "$ref": "#/components/schemas/StudioPreviewStreamState"
          }
        },
        "required": [
          "bounds",
          "closeReason",
          "currentRevision",
          "expiresAt",
          "id",
          "keepaliveMs",
          "negotiation",
          "offer",
          "projectId",
          "revision",
          "start",
          "state"
        ],
        "type": "object"
      },
      "StudioPreviewStreamState": {
        "description": "Where the session is",
        "enum": [
          "queued",
          "negotiating",
          "offered",
          "answered",
          "closed"
        ],
        "type": "string"
      },
      "StudioPreviewTimeDto": {
        "properties": {
          "denominator": {
            "description": "Time denominator; must be positive",
            "pattern": "^-?\\d{1,16}$",
            "type": "string"
          },
          "numerator": {
            "description": "Time numerator, in seconds over the denominator",
            "pattern": "^-?\\d{1,16}$",
            "type": "string"
          }
        },
        "required": [
          "denominator",
          "numerator"
        ],
        "type": "object"
      },
      "StudioPreviewStreamCloseReason": {
        "description": "Why a closed session closed",
        "enum": [
          "closed",
          "superseded",
          "revoked",
          "stale-revision",
          "expired",
          "worker-lost",
          "failed"
        ],
        "type": "string"
      },
      "StudioPreviewStreamBoundsDto": {
        "properties": {
          "maxBitrateKbps": {
            "description": "Bitrate the worker may not exceed; the server writes it into the relayed answer",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "maxDurationSeconds": {
            "description": "The session closes after this long; playing on opens a new one",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "maxFrameRate": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "maxHeight": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "maxWidth": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "maxBitrateKbps",
          "maxDurationSeconds",
          "maxFrameRate",
          "maxHeight",
          "maxWidth"
        ],
        "type": "object"
      },
      "StudioPreviewStreamOpenDto": {
        "properties": {
          "projectId": {
            "description": "Studio project to play",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "quality": {
            "$ref": "#/components/schemas/StudioPreviewQuality"
          },
          "revision": {
            "description": "Stored project revision to play; a superseded revision is refused",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "time": {
            "$ref": "#/components/schemas/StudioPreviewTimeDto"
          },
          "viewportHeight": {
            "maximum": 7680,
            "minimum": 16,
            "type": "integer"
          },
          "viewportWidth": {
            "maximum": 7680,
            "minimum": 16,
            "type": "integer"
          }
        },
        "required": [
          "projectId",
          "quality",
          "revision",
          "time",
          "viewportHeight",
          "viewportWidth"
        ],
        "type": "object"
      },
      "StudioPreviewQuality": {
        "description": "Studio preview quality",
        "enum": [
          "draft",
          "standard",
          "full"
        ],
        "type": "string"
      },
      "StudioPreviewStreamAnswerDto": {
        "properties": {
          "negotiation": {
            "description": "The round this answer answers",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "sdp": {
            "description": "A complete session description (SDP)",
            "maxLength": 65536,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "negotiation",
          "sdp"
        ],
        "type": "object"
      },
      "StudioPreviewResponseDto": {
        "properties": {
          "currentRevision": {
            "description": "The stored revision the project is on now",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "preview": {
            "$ref": "#/components/schemas/StudioPreviewDto"
          },
          "supersededPreviewIds": {
            "description": "Previews cancelled because the revision advanced",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "currentRevision",
          "preview",
          "supersededPreviewIds"
        ],
        "type": "object"
      },
      "StudioPreviewDto": {
        "properties": {
          "admissionReleased": {
            "description": "Delivery was durably fenced; does not establish renderer termination",
            "type": "boolean"
          },
          "cancellationState": {
            "enum": [
              "not-needed",
              "requested",
              "acknowledged",
              "unavailable"
            ],
            "type": "string"
          },
          "consumerRequestId": {
            "description": "Captured opt-in consumer admission identity",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "contentType": {
            "nullable": true,
            "type": "string"
          },
          "errorCode": {
            "description": "Stable code the client turns into a message",
            "nullable": true,
            "type": "string"
          },
          "etag": {
            "description": "Revision-bound entity tag for the frame endpoint",
            "type": "string"
          },
          "expiresAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "framePts": {
            "nullable": true,
            "type": "string"
          },
          "framePtsTimebase": {
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "Preview frame ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "operationId": {
            "description": "The durable job rendering this frame, when one has been created",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "projectId": {
            "type": "string"
          },
          "quality": {
            "$ref": "#/components/schemas/StudioPreviewQuality"
          },
          "readyAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "rendererReleased": {
            "description": "True only after the captured operation acknowledged cancellation with resources released",
            "nullable": true,
            "type": "boolean"
          },
          "requestedAt": {
            "format": "date-time",
            "type": "string"
          },
          "revision": {
            "description": "The stored project revision this frame was rendered for",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "revisionDigest": {
            "description": "Digest of the authorized resolution the frame is bound to; changes with the revision and whenever access is re-resolved",
            "type": "string"
          },
          "seekGeneration": {
            "description": "The seek this frame answers",
            "type": "string"
          },
          "sizeInBytes": {
            "nullable": true,
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/StudioPreviewStatus"
          },
          "time": {
            "$ref": "#/components/schemas/StudioPreviewTimeDto"
          },
          "toneMapped": {
            "description": "The frame is an explicitly tone-mapped SDR rendering; never the colour authority",
            "type": "boolean"
          },
          "viewportHeight": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "viewportWidth": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "contentType",
          "errorCode",
          "etag",
          "expiresAt",
          "framePts",
          "framePtsTimebase",
          "id",
          "operationId",
          "projectId",
          "quality",
          "readyAt",
          "requestedAt",
          "revision",
          "revisionDigest",
          "seekGeneration",
          "sizeInBytes",
          "status",
          "time",
          "toneMapped",
          "viewportHeight",
          "viewportWidth"
        ],
        "type": "object"
      },
      "StudioPreviewStatus": {
        "description": "Studio preview status",
        "enum": [
          "pending",
          "rendering",
          "ready",
          "superseded",
          "failed",
          "evicted"
        ],
        "type": "string"
      },
      "StudioPreviewRequestDto": {
        "properties": {
          "consumerRequestId": {
            "description": "Opt in to a session-isolated admission; use a fresh UUID for each logical request",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "projectId": {
            "description": "Studio project the frame belongs to",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "quality": {
            "$ref": "#/components/schemas/StudioPreviewQuality"
          },
          "revision": {
            "description": "Stored project revision the frame is bound to; a superseded revision is refused",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "seekGeneration": {
            "default": 0,
            "description": "The client's monotonic seek counter, echoed back on the result",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "time": {
            "$ref": "#/components/schemas/StudioPreviewTimeDto"
          },
          "viewportHeight": {
            "maximum": 7680,
            "minimum": 16,
            "type": "integer"
          },
          "viewportWidth": {
            "maximum": 7680,
            "minimum": 16,
            "type": "integer"
          }
        },
        "required": [
          "projectId",
          "quality",
          "revision",
          "time",
          "viewportHeight",
          "viewportWidth"
        ],
        "type": "object"
      },
      "StudioProjectListResponseDto": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/StudioProjectDto"
            },
            "type": "array"
          },
          "total": {
            "description": "Matching projects, before paging",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "type": "object"
      },
      "StudioProjectDto": {
        "properties": {
          "access": {
            "$ref": "#/components/schemas/StudioProjectAccess"
          },
          "archivedAt": {
            "description": "When the owner archived it",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "deletedAt": {
            "description": "When it was moved to the trash",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "duplicatedFromId": {
            "description": "The project this one was duplicated from; null for a reviewer",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "id": {
            "description": "Studio project ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "importedFromBundle": {
            "description": "The project was read in from a portable bundle; always false for a reviewer",
            "type": "boolean"
          },
          "lastOpenedAt": {
            "description": "When an editor last opened it; null for a reviewer",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "lease": {
            "$ref": "#/components/schemas/StudioProjectLeaseDto"
          },
          "name": {
            "type": "string"
          },
          "ownerId": {
            "description": "The only account that may write",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "purgeAfter": {
            "description": "When a trashed project is deleted for good; its library media is never touched",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "revision": {
            "description": "Head revision number; 0 until the first save",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "shelf": {
            "$ref": "#/components/schemas/StudioProjectShelf"
          },
          "spaceId": {
            "description": "Shared space whose members may review the project",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "thumbnailAssetId": {
            "description": "Library asset the owner chose as the poster; null for a reviewer",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "access",
          "archivedAt",
          "createdAt",
          "deletedAt",
          "duplicatedFromId",
          "id",
          "importedFromBundle",
          "lastOpenedAt",
          "lease",
          "name",
          "ownerId",
          "purgeAfter",
          "revision",
          "shelf",
          "spaceId",
          "thumbnailAssetId",
          "updatedAt"
        ],
        "type": "object"
      },
      "StudioProjectShelf": {
        "description": "`active`, `archived` (put away, read-only) or `trashed` (restorable until `purgeAfter`)",
        "enum": [
          "active",
          "archived",
          "trashed"
        ],
        "type": "string"
      },
      "StudioProjectLeaseDto": {
        "properties": {
          "autosaveDebounceMs": {
            "description": "Pause in editing after which the client saves",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "expiresAt": {
            "description": "When the current lease lapses",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "heldByAnother": {
            "description": "A live lease belongs to another editor instance",
            "type": "boolean"
          },
          "heldByYou": {
            "description": "This client holds the write lease",
            "type": "boolean"
          },
          "leaseMs": {
            "description": "Lease length the server grants",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "renewMs": {
            "description": "How often the holder should renew",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "autosaveDebounceMs",
          "expiresAt",
          "heldByAnother",
          "heldByYou",
          "leaseMs",
          "renewMs"
        ],
        "type": "object"
      },
      "StudioProjectAccess": {
        "description": "`owner` may write; `reviewer` reaches the project through a shared space, read-only",
        "enum": [
          "owner",
          "reviewer"
        ],
        "type": "string"
      },
      "StudioProjectSort": {
        "description": "`updated` newest change first, `recent` last opened first, `name` alphabetical",
        "enum": [
          "updated",
          "recent",
          "name"
        ],
        "type": "string"
      },
      "StudioProjectDetailDto": {
        "properties": {
          "access": {
            "$ref": "#/components/schemas/StudioProjectAccess"
          },
          "archivedAt": {
            "description": "When the owner archived it",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "deletedAt": {
            "description": "When it was moved to the trash",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "digest": {
            "description": "Key-sorted SHA-256 of the head envelope; null when withheld",
            "nullable": true,
            "type": "string"
          },
          "duplicatedFromId": {
            "description": "The project this one was duplicated from; null for a reviewer",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "envelope": {
            "allOf": [
              {
                "$ref": "#/components/schemas/StudioProjectEnvelopeDto"
              }
            ],
            "nullable": true
          },
          "id": {
            "description": "Studio project ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "importedFromBundle": {
            "description": "The project was read in from a portable bundle; always false for a reviewer",
            "type": "boolean"
          },
          "lastOpenedAt": {
            "description": "When an editor last opened it; null for a reviewer",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "lease": {
            "$ref": "#/components/schemas/StudioProjectLeaseDto"
          },
          "name": {
            "type": "string"
          },
          "ownerId": {
            "description": "The only account that may write",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "purgeAfter": {
            "description": "When a trashed project is deleted for good; its library media is never touched",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "resources": {
            "allOf": [
              {
                "$ref": "#/components/schemas/StudioProjectResourcesDto"
              }
            ],
            "nullable": true
          },
          "revision": {
            "description": "Head revision number; 0 until the first save",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "shelf": {
            "$ref": "#/components/schemas/StudioProjectShelf"
          },
          "spaceId": {
            "description": "Shared space whose members may review the project",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "thumbnailAssetId": {
            "description": "Library asset the owner chose as the poster; null for a reviewer",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "withheld": {
            "description": "The graph was withheld because a source is unavailable to you",
            "type": "boolean"
          }
        },
        "required": [
          "access",
          "archivedAt",
          "createdAt",
          "deletedAt",
          "digest",
          "duplicatedFromId",
          "envelope",
          "id",
          "importedFromBundle",
          "lastOpenedAt",
          "lease",
          "name",
          "ownerId",
          "purgeAfter",
          "resources",
          "revision",
          "shelf",
          "spaceId",
          "thumbnailAssetId",
          "updatedAt",
          "withheld"
        ],
        "type": "object"
      },
      "StudioProjectResourcesDto": {
        "properties": {
          "checkedAt": {
            "description": "When the resolution ran",
            "format": "date-time",
            "type": "string"
          },
          "complete": {
            "description": "Every referenced source resolved for the acting account",
            "type": "boolean"
          },
          "hdrProxySources": {
            "description": "the hdrSources whose Studio HDR intermediate is ready, so the editor reads their real HDR pixels (GET /assets/{id}/video/studio-hdr). The others are being made",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "hdrSources": {
            "description": "owner decision: placed library videos whose original is HDR (PQ or HLG transfer, or Dolby Vision). A project that places one is an HDR project. Only sources that resolved for the acting account are named",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "hiddenSources": {
            "description": "follow-up: the owner's own library items this project places that are hidden from this session (Locked, or matched by a Locked rule, while the session is locked). The project keeps them; the editor hides their clips rather than showing missing media. The owner's only; empty for a reviewer",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "refusedCount": {
            "description": "References that were refused for the acting account",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "unsupportedSources": {
            "description": "placed videos this server cannot decode, refused as 'unsupported-source' when admitted. The owner's only; empty for a reviewer",
            "items": {
              "$ref": "#/components/schemas/StudioUnsupportedSourceDto"
            },
            "type": "array"
          }
        },
        "required": [
          "checkedAt",
          "complete",
          "hdrProxySources",
          "hdrSources",
          "hiddenSources",
          "refusedCount",
          "unsupportedSources"
        ],
        "type": "object"
      },
      "StudioUnsupportedSourceDto": {
        "properties": {
          "assetId": {
            "description": "The library video placed in the project",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "reason": {
            "description": "Why, in plain words",
            "type": "string"
          },
          "refusal": {
            "$ref": "#/components/schemas/DecodeRefusal"
          }
        },
        "required": [
          "assetId",
          "reason",
          "refusal"
        ],
        "type": "object"
      },
      "StudioProjectEnvelopeDto": {
        "properties": {
          "engine": {
            "description": "The engine that produced the graph; `freecut`",
            "type": "string"
          },
          "engineRevision": {
            "description": "Pinned engine revision the editor was built from",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "graph": {
            "additionalProperties": {},
            "description": "Opaque engine document, stored and returned byte for byte",
            "type": "object"
          },
          "schemaVersion": {
            "description": "Envelope shape version; the server accepts exactly one",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "engine",
          "engineRevision",
          "graph",
          "schemaVersion"
        ],
        "type": "object"
      },
      "StudioProjectCreateDto": {
        "properties": {
          "clientId": {
            "description": "This editor instance; it receives the lease",
            "pattern": "^[\\w.:-]{1,128}$",
            "type": "string"
          },
          "envelope": {
            "$ref": "#/components/schemas/StudioProjectEnvelopeDto",
            "description": "An initial document, saved as revision 1"
          },
          "name": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "requestKey": {
            "description": "Owner-scoped idempotency key for project creation; reuse requires the same payload",
            "pattern": "^[\\w.:-]{1,128}$",
            "type": "string"
          },
          "spaceId": {
            "description": "Share the project with a shared space for review",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "clientId",
          "name"
        ],
        "type": "object"
      },
      "StudioProjectTrashEmptyResponseDto": {
        "properties": {
          "count": {
            "description": "Projects deleted for good",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "type": "object"
      },
      "StudioProjectUpdateDto": {
        "properties": {
          "archived": {
            "description": "Archive (read-only, off the active shelf) or bring back",
            "type": "boolean"
          },
          "name": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "spaceId": {
            "description": "Set or clear the reviewing shared space",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "thumbnailAssetId": {
            "description": "A library asset you can read, shown as the poster; null clears it",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "StudioCommentListResponseDto": {
        "properties": {
          "items": {
            "description": "Oldest first",
            "items": {
              "$ref": "#/components/schemas/StudioCommentDto"
            },
            "type": "array"
          },
          "total": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "type": "object"
      },
      "StudioCommentDto": {
        "properties": {
          "authorId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "projectId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "resolvedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "resolvedById": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "revision": {
            "description": "The revision the reviewer was looking at",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "text": {
            "type": "string"
          },
          "time": {
            "$ref": "#/components/schemas/StudioTimeDto"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "authorId",
          "createdAt",
          "id",
          "projectId",
          "resolvedAt",
          "resolvedById",
          "revision",
          "text",
          "time",
          "updatedAt"
        ],
        "type": "object"
      },
      "StudioTimeDto": {
        "properties": {
          "den": {
            "description": "Denominator",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "num": {
            "description": "Numerator; zero is the start of the sequence",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "den",
          "num"
        ],
        "type": "object"
      },
      "StudioCommentCreateDto": {
        "properties": {
          "requestKey": {
            "description": "Client-chosen identifier; letters, digits, `_ . : -`, up to 128 characters",
            "pattern": "^[\\w.:-]{1,128}$",
            "type": "string"
          },
          "revision": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "text": {
            "maxLength": 2000,
            "minLength": 1,
            "type": "string"
          },
          "time": {
            "$ref": "#/components/schemas/StudioTimeDto"
          }
        },
        "required": [
          "revision",
          "text",
          "time"
        ],
        "type": "object"
      },
      "StudioCommentUpdateDto": {
        "properties": {
          "resolved": {
            "type": "boolean"
          },
          "text": {
            "maxLength": 2000,
            "minLength": 1,
            "type": "string"
          }
        },
        "type": "object"
      },
      "StudioProjectDuplicateDto": {
        "properties": {
          "name": {
            "description": "Name of the copy; the client supplies the translated default",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          }
        },
        "type": "object"
      },
      "StudioProjectImportDto": {
        "properties": {
          "checksum": {
            "description": "SHA-256 of the bytes, hex",
            "type": "string"
          },
          "contentType": {
            "description": "Content type read from the bytes, not the name",
            "type": "string"
          },
          "createdAt": {
            "description": "When it was uploaded",
            "format": "date-time",
            "type": "string"
          },
          "externalReferences": {
            "description": "External subresources an SVG or Lottie graphic names; a graphic with any cannot be rendered",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "fileName": {
            "description": "The name the file was uploaded with",
            "type": "string"
          },
          "id": {
            "description": "Import id; clips reference it as `importId`",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/StudioProjectImportKind"
          },
          "sizeBytes": {
            "description": "Size in bytes",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "checksum",
          "contentType",
          "createdAt",
          "externalReferences",
          "fileName",
          "id",
          "kind",
          "sizeBytes"
        ],
        "type": "object"
      },
      "StudioProjectImportKind": {
        "description": "What the file is, read from its bytes",
        "enum": [
          "audio",
          "image",
          "video",
          "vector",
          "captions",
          "lut"
        ],
        "type": "string"
      },
      "StudioProjectImportCreateDto": {
        "properties": {
          "file": {
            "description": "The file to import",
            "format": "binary",
            "type": "string"
          },
          "id": {
            "description": "The media id the editor gave this file; retrying the same file with it is idempotent",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          }
        },
        "required": [
          "file",
          "id"
        ],
        "type": "object"
      },
      "StudioProjectLeaseRequestDto": {
        "properties": {
          "clientId": {
            "description": "Client-chosen identifier; letters, digits, `_ . : -`, up to 128 characters",
            "pattern": "^[\\w.:-]{1,128}$",
            "type": "string"
          },
          "takeover": {
            "description": "Take a live lease away from another of your editor instances; never implicit",
            "type": "boolean"
          }
        },
        "required": [
          "clientId"
        ],
        "type": "object"
      },
      "StudioProjectSaveResponseDto": {
        "properties": {
          "digest": {
            "description": "Digest of the head envelope",
            "type": "string"
          },
          "lease": {
            "$ref": "#/components/schemas/StudioProjectLeaseDto"
          },
          "replayed": {
            "description": "This request key was already accepted; the earlier result is returned",
            "type": "boolean"
          },
          "resources": {
            "allOf": [
              {
                "$ref": "#/components/schemas/StudioProjectResourcesDto"
              }
            ],
            "description": "how the sources of a newly written revision resolved; absent when nothing was written, null when the resolution could not run",
            "nullable": true
          },
          "revision": {
            "description": "The head after this request",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "revisionId": {
            "description": "The revision row; null when nothing was written",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "unchanged": {
            "description": "The document equals the head, so no revision was written",
            "type": "boolean"
          }
        },
        "required": [
          "digest",
          "lease",
          "replayed",
          "revision",
          "revisionId",
          "unchanged"
        ],
        "type": "object"
      },
      "StudioProjectRestoreDto": {
        "properties": {
          "clientId": {
            "description": "Client-chosen identifier; letters, digits, `_ . : -`, up to 128 characters",
            "pattern": "^[\\w.:-]{1,128}$",
            "type": "string"
          },
          "expectedRevision": {
            "description": "The current head; the restore appends after it",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "requestKey": {
            "description": "Client-chosen identifier; letters, digits, `_ . : -`, up to 128 characters",
            "pattern": "^[\\w.:-]{1,128}$",
            "type": "string"
          },
          "revision": {
            "description": "The historical revision to bring back",
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "clientId",
          "expectedRevision",
          "requestKey",
          "revision"
        ],
        "type": "object"
      },
      "StudioReverseConformQueuedDto": {
        "properties": {
          "operationId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "operationId"
        ],
        "type": "object"
      },
      "StudioReverseConformEnqueueDto": {
        "properties": {
          "clientId": {
            "pattern": "^[\\w.:-]{1,128}$",
            "type": "string"
          },
          "command": {
            "properties": {
              "id": {
                "enum": [
                  "job.enqueueReverseConform"
                ],
                "type": "string"
              },
              "idempotencyKey": {
                "pattern": "^[\\w.:-]{1,128}$",
                "type": "string"
              },
              "issuedAt": {
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "payload": {
                "properties": {
                  "clipId": {
                    "pattern": "^[\\w.:-]{1,128}$",
                    "type": "string"
                  },
                  "destinationId": {
                    "enum": [
                      "local"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "clipId",
                  "destinationId"
                ],
                "type": "object"
              },
              "revision": {
                "maximum": 9007199254740991,
                "minimum": 1,
                "type": "integer"
              }
            },
            "required": [
              "id",
              "payload",
              "revision",
              "idempotencyKey",
              "issuedAt"
            ],
            "type": "object"
          }
        },
        "required": [
          "clientId",
          "command"
        ],
        "type": "object"
      },
      "StudioReverseConformApplyDto": {
        "properties": {
          "clientId": {
            "pattern": "^[\\w.:-]{1,128}$",
            "type": "string"
          },
          "operationId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "clientId",
          "operationId"
        ],
        "type": "object"
      },
      "StudioProjectHistoryResponseDto": {
        "properties": {
          "items": {
            "description": "Newest first",
            "items": {
              "$ref": "#/components/schemas/StudioProjectRevisionDto"
            },
            "type": "array"
          },
          "total": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "type": "object"
      },
      "StudioProjectRevisionDto": {
        "properties": {
          "authorId": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "digest": {
            "description": "Null for a reviewer; the digest travels with the graph",
            "nullable": true,
            "type": "string"
          },
          "graphBytes": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "restoredFromRevision": {
            "description": "Set when this revision restored an earlier one",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "revision": {
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "summary": {
            "$ref": "#/components/schemas/StudioCommandSummaryDto"
          }
        },
        "required": [
          "authorId",
          "createdAt",
          "digest",
          "graphBytes",
          "id",
          "restoredFromRevision",
          "revision",
          "summary"
        ],
        "type": "object"
      },
      "StudioCommandSummaryDto": {
        "properties": {
          "counts": {
            "additionalProperties": {
              "maximum": 9007199254740991,
              "minimum": 0,
              "type": "integer"
            },
            "description": "Command id to how many times it appeared",
            "type": "object"
          },
          "total": {
            "description": "Commands in the batch",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "counts",
          "total"
        ],
        "type": "object"
      },
      "StudioProjectSaveDto": {
        "properties": {
          "clientId": {
            "description": "Client-chosen identifier; letters, digits, `_ . : -`, up to 128 characters",
            "pattern": "^[\\w.:-]{1,128}$",
            "type": "string"
          },
          "commands": {
            "description": "The canonical commands the engine applied to produce this document (). Each is checked against the catalogue and the head, and the revision summary is counted from them.",
            "items": {
              "$ref": "#/components/schemas/StudioCommandEnvelopeDto"
            },
            "maxItems": 500,
            "type": "array"
          },
          "envelope": {
            "$ref": "#/components/schemas/StudioProjectEnvelopeDto"
          },
          "expectedRevision": {
            "description": "The head this document was built on",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "requestKey": {
            "description": "Stable per attempt; a retry carries the same key",
            "pattern": "^[\\w.:-]{1,128}$",
            "type": "string"
          },
          "summary": {
            "$ref": "#/components/schemas/StudioCommandSummaryDto"
          }
        },
        "required": [
          "clientId",
          "envelope",
          "expectedRevision",
          "requestKey"
        ],
        "type": "object"
      },
      "StudioCommandEnvelopeDto": {
        "properties": {
          "id": {
            "description": "Published command id (studio/frameleaf-studio-commands.json)",
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "idempotencyKey": {
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "issuedAt": {
            "description": "Epoch milliseconds",
            "format": "double",
            "type": "number"
          },
          "payload": {
            "additionalProperties": {},
            "description": "Command payload; graph-shaped values pass through unread",
            "type": "object"
          },
          "revision": {
            "description": "The head revision the command was issued against",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "id",
          "idempotencyKey",
          "issuedAt",
          "payload",
          "revision"
        ],
        "type": "object"
      },
      "StudioProjectRevisionDetailDto": {
        "properties": {
          "authorId": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "digest": {
            "description": "Null for a reviewer; the digest travels with the graph",
            "nullable": true,
            "type": "string"
          },
          "envelope": {
            "allOf": [
              {
                "$ref": "#/components/schemas/StudioProjectEnvelopeDto"
              }
            ],
            "nullable": true
          },
          "graphBytes": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "resources": {
            "allOf": [
              {
                "$ref": "#/components/schemas/StudioProjectResourcesDto"
              }
            ],
            "nullable": true
          },
          "restoredFromRevision": {
            "description": "Set when this revision restored an earlier one",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "revision": {
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "summary": {
            "$ref": "#/components/schemas/StudioCommandSummaryDto"
          },
          "withheld": {
            "type": "boolean"
          }
        },
        "required": [
          "authorId",
          "createdAt",
          "digest",
          "envelope",
          "graphBytes",
          "id",
          "resources",
          "restoredFromRevision",
          "revision",
          "summary",
          "withheld"
        ],
        "type": "object"
      },
      "StudioProjectDiffDto": {
        "properties": {
          "added": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "byteDelta": {
            "description": "Size change of the serialized graph",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "changed": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "commands": {
            "$ref": "#/components/schemas/StudioCommandSummaryDto",
            "description": "Commands the saves between the two revisions reported"
          },
          "from": {
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "identical": {
            "description": "The two envelopes have the same digest",
            "type": "boolean"
          },
          "paths": {
            "description": "Changed graph paths, aggregated and capped",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "removed": {
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "to": {
            "maximum": 9007199254740991,
            "minimum": 1,
            "type": "integer"
          },
          "truncated": {
            "description": "More paths changed than are listed",
            "type": "boolean"
          }
        },
        "required": [
          "added",
          "byteDelta",
          "changed",
          "commands",
          "from",
          "identical",
          "paths",
          "removed",
          "to",
          "truncated"
        ],
        "type": "object"
      },
      "StudioRestoredVersionDto": {
        "properties": {
          "assetId": {
            "description": "The library original it was made from; never replaced by it",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "available": {
            "description": "Whether it can be placed and rendered now",
            "type": "boolean"
          },
          "durationSeconds": {
            "description": "Length of a video, in seconds",
            "format": "double",
            "nullable": true,
            "type": "number"
          },
          "expiresAt": {
            "description": "When the result will be removed, when it has a retention date",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "height": {
            "description": "Pixel height of the restored file",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "mediaId": {
            "description": "The media id a clip of this version carries: `restored-<restorationId>`",
            "type": "string"
          },
          "mode": {
            "$ref": "#/components/schemas/AssetRestorationMode"
          },
          "originalFileName": {
            "description": "The original’s file name, for the bin label",
            "type": "string"
          },
          "restorationId": {
            "description": "The restoration",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "restoredAt": {
            "description": "When the full result finished",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "smoothMotionFactor": {
            "description": "Frame-rate factor of a Smooth motion version",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "sourceType": {
            "$ref": "#/components/schemas/AssetRestorationSourceType"
          },
          "unavailable": {
            "allOf": [
              {
                "$ref": "#/components/schemas/StudioRestoredVersionUnavailable"
              }
            ],
            "nullable": true
          },
          "upscale": {
            "description": "Upscale factor of a restoration; 1 for Smooth motion",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "width": {
            "description": "Pixel width of the restored file",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          }
        },
        "required": [
          "assetId",
          "available",
          "durationSeconds",
          "expiresAt",
          "height",
          "mediaId",
          "mode",
          "originalFileName",
          "restorationId",
          "restoredAt",
          "smoothMotionFactor",
          "sourceType",
          "unavailable",
          "upscale",
          "width"
        ],
        "type": "object"
      },
      "StudioRestoredVersionUnavailable": {
        "description": "Why the restored version cannot be placed",
        "enum": [
          "discarded",
          "expired",
          "not-ready",
          "locked",
          "trashed",
          "offline",
          "hidden-content"
        ],
        "type": "string"
      },
      "AssetRestorationSourceType": {
        "description": "Whether the restored source is a still image or a video",
        "enum": [
          "image",
          "video"
        ],
        "type": "string"
      },
      "AssetRestorationMode": {
        "description": "Restoration model family",
        "enum": [
          "faithful",
          "creative",
          "smooth_motion"
        ],
        "type": "string"
      },
      "StudioWorkspaceDto": {
        "properties": {
          "engineRevision": {
            "description": "The engine revision that wrote the layout",
            "nullable": true,
            "type": "string"
          },
          "layout": {
            "additionalProperties": {},
            "description": "The engine layout as the same JSON value it was saved as (key order and spacing are not kept); null when none is stored",
            "nullable": true,
            "type": "object"
          },
          "savedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "engineRevision",
          "layout",
          "savedAt"
        ],
        "type": "object"
      },
      "StudioWorkspaceSaveDto": {
        "properties": {
          "engineRevision": {
            "description": "The pinned engine revision writing it",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "layout": {
            "additionalProperties": {},
            "description": "The engine layout; stored and returned as the same JSON value (key order and spacing are not kept)",
            "type": "object"
          }
        },
        "required": [
          "engineRevision",
          "layout"
        ],
        "type": "object"
      },
      "TagCreateDto": {
        "properties": {
          "color": {
            "description": "Tag color (hex)",
            "nullable": true,
            "pattern": "^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$",
            "type": "string"
          },
          "name": {
            "description": "Tag name",
            "pattern": "^[^/]*$",
            "type": "string"
          },
          "parentId": {
            "description": "Parent tag ID",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "TagUpsertDto": {
        "properties": {
          "tags": {
            "description": "Tag names to upsert",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "tags"
        ],
        "type": "object"
      },
      "TagBulkAssetsResponseDto": {
        "properties": {
          "count": {
            "description": "Number of assets tagged",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "type": "object"
      },
      "TagBulkAssetsDto": {
        "properties": {
          "assetIds": {
            "description": "Asset IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          },
          "tagIds": {
            "description": "Tag IDs",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "assetIds",
          "tagIds"
        ],
        "type": "object"
      },
      "TagStatisticsResponseDto": {
        "properties": {
          "count": {
            "description": "Timeline items tagged with exactly this tag",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "id": {
            "description": "Tag ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "total": {
            "description": "Timeline items tagged with this tag or any tag nested under it",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "count",
          "id",
          "total"
        ],
        "type": "object"
      },
      "TagUpdateDto": {
        "properties": {
          "color": {
            "description": "Tag color (hex)",
            "nullable": true,
            "pattern": "^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$",
            "type": "string"
          },
          "name": {
            "description": "Tag name",
            "pattern": "^[^/]*$",
            "type": "string"
          },
          "parentId": {
            "description": "Move the tag under this parent tag; null moves it to the top level. The tag and all its descendants take the new path",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "TakeoutResponseDto": {
        "properties": {
          "action": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TakeoutAction"
              }
            ],
            "description": "What the latest job did or is doing",
            "nullable": true
          },
          "albums": {
            "items": {
              "$ref": "#/components/schemas/TakeoutAlbumDto"
            },
            "type": "array"
          },
          "counts": {
            "$ref": "#/components/schemas/TakeoutCountsDto"
          },
          "createdAt": {
            "type": "string"
          },
          "error": {
            "nullable": true,
            "type": "string"
          },
          "errorCode": {
            "nullable": true,
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "operationId": {
            "description": "The latest job, as Activity lists it",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "options": {
            "$ref": "#/components/schemas/TakeoutOptionsResponseDto"
          },
          "phase": {
            "$ref": "#/components/schemas/TakeoutPhase"
          },
          "processed": {
            "description": "Units the latest job has finished",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "sources": {
            "items": {
              "$ref": "#/components/schemas/TakeoutSourceResponseDto"
            },
            "type": "array"
          },
          "state": {
            "$ref": "#/components/schemas/TakeoutState"
          },
          "total": {
            "description": "Units the latest job knows of so far; grows while a scan reads its sources",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "updatedAt": {
            "type": "string"
          }
        },
        "required": [
          "action",
          "albums",
          "counts",
          "createdAt",
          "error",
          "errorCode",
          "id",
          "name",
          "operationId",
          "options",
          "phase",
          "processed",
          "sources",
          "state",
          "total",
          "updatedAt"
        ],
        "type": "object"
      },
      "TakeoutState": {
        "description": "Where the import is: staging sources, a scan or import job at work, awaiting review, or done",
        "enum": [
          "sources",
          "queued",
          "scanning",
          "review",
          "importing",
          "paused",
          "cancelling",
          "cancelled",
          "failed",
          "completed"
        ],
        "type": "string"
      },
      "TakeoutSourceResponseDto": {
        "properties": {
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/TakeoutSourceKind"
          },
          "name": {
            "description": "The archive’s file name, or the directory’s name",
            "type": "string"
          },
          "received": {
            "description": "Bytes staged so far; an upload resumes here",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "rejected": {
            "description": "Entries refused: unsafe names, links or encryption",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "scanned": {
            "description": "Every entry has been read",
            "type": "boolean"
          },
          "size": {
            "description": "Declared archive size in bytes; zero for a directory",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "id",
          "kind",
          "name",
          "received",
          "rejected",
          "scanned",
          "size"
        ],
        "type": "object"
      },
      "TakeoutSourceKind": {
        "description": "An uploaded archive or a server directory",
        "enum": [
          "zip",
          "directory"
        ],
        "type": "string"
      },
      "TakeoutPhase": {
        "description": "The step the import has reached",
        "enum": [
          "sources",
          "scanning",
          "review",
          "importing",
          "completed"
        ],
        "type": "string"
      },
      "TakeoutOptionsResponseDto": {
        "properties": {
          "albums": {
            "type": "boolean"
          },
          "archive": {
            "type": "boolean"
          },
          "dates": {
            "type": "boolean"
          },
          "descriptions": {
            "type": "boolean"
          },
          "favorites": {
            "type": "boolean"
          },
          "locations": {
            "type": "boolean"
          },
          "selectedAlbums": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "sidecarReview": {
            "type": "boolean"
          },
          "updateMatchedMetadata": {
            "type": "boolean"
          }
        },
        "required": [
          "albums",
          "archive",
          "dates",
          "descriptions",
          "favorites",
          "locations",
          "sidecarReview",
          "updateMatchedMetadata"
        ],
        "type": "object"
      },
      "TakeoutCountsDto": {
        "properties": {
          "failed": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "files": {
            "description": "Files found in the sources",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "hiddenLocked": {
            "description": "Items going into Locked, not listed until Locked is unlocked",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "imported": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "importing": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "items": {
            "description": "Photos and videos",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "matched": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "matchedOriginals": {
            "description": "Items already in the library, whose album memberships are restored",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "newAssets": {
            "description": "Items still to import that are not in the library yet",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "ready": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "rejected": {
            "description": "Archive entries refused",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "review": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "skipped": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "suggestedPairs": {
            "description": "Possible Live Photo pairs awaiting a decision",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "unresolvedPairs": {
            "description": "Live Photo pairs that could not be linked",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "failed",
          "files",
          "hiddenLocked",
          "imported",
          "importing",
          "items",
          "matched",
          "matchedOriginals",
          "newAssets",
          "ready",
          "rejected",
          "review",
          "skipped",
          "suggestedPairs",
          "unresolvedPairs"
        ],
        "type": "object"
      },
      "TakeoutAlbumDto": {
        "properties": {
          "count": {
            "description": "Items in the folder",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "folder": {
            "description": "The export folder",
            "type": "string"
          },
          "name": {
            "description": "The album name it becomes",
            "type": "string"
          },
          "selected": {
            "description": "Recreated by the next import",
            "type": "boolean"
          },
          "year": {
            "description": "One of Google’s automatic year folders",
            "type": "boolean"
          }
        },
        "required": [
          "count",
          "folder",
          "name",
          "selected",
          "year"
        ],
        "type": "object"
      },
      "TakeoutAction": {
        "description": "The step a job carries out",
        "enum": [
          "scan",
          "import"
        ],
        "type": "string"
      },
      "TakeoutCreateDto": {
        "properties": {
          "directory": {
            "description": "Administrators only: the directory inside the root, relative to it; empty for the root itself",
            "maxLength": 4096,
            "type": "string"
          },
          "name": {
            "description": "A name for this import",
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "rootId": {
            "description": "Administrators only: the permitted import root to read a server directory from",
            "maxLength": 32,
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "TakeoutRootsResponseDto": {
        "properties": {
          "roots": {
            "items": {
              "$ref": "#/components/schemas/TakeoutRootDto"
            },
            "type": "array"
          }
        },
        "required": [
          "roots"
        ],
        "type": "object"
      },
      "TakeoutRootDto": {
        "properties": {
          "id": {
            "type": "string"
          },
          "path": {
            "description": "The directory the administrator permitted",
            "type": "string"
          }
        },
        "required": [
          "id",
          "path"
        ],
        "type": "object"
      },
      "TakeoutArchiveCreateDto": {
        "properties": {
          "name": {
            "description": "The archive’s file name",
            "maxLength": 255,
            "minLength": 1,
            "type": "string"
          },
          "size": {
            "description": "The archive’s size in bytes",
            "maximum": 1099511627776,
            "minimum": 22,
            "type": "integer"
          }
        },
        "required": [
          "name",
          "size"
        ],
        "type": "object"
      },
      "TakeoutVerifyChunkDto": {
        "properties": {
          "offset": {
            "description": "Byte offset of the range",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "sha256": {
            "description": "SHA-256 of the range, hex",
            "pattern": "^[a-f0-9]{64}$",
            "type": "string"
          },
          "size": {
            "description": "Length of the range",
            "maximum": 8388608,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "offset",
          "sha256",
          "size"
        ],
        "type": "object"
      },
      "TakeoutControlDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/TakeoutControlAction"
          }
        },
        "required": [
          "action"
        ],
        "type": "object"
      },
      "TakeoutControlAction": {
        "description": "What to do with the running job",
        "enum": [
          "pause",
          "resume",
          "cancel"
        ],
        "type": "string"
      },
      "TakeoutOptionsDto": {
        "properties": {
          "albums": {
            "default": true,
            "description": "Recreate album memberships, including for photos already in the library",
            "type": "boolean"
          },
          "archive": {
            "default": true,
            "description": "Bring over archived photos as archived",
            "type": "boolean"
          },
          "dates": {
            "default": true,
            "description": "Bring over the dates photos were taken",
            "type": "boolean"
          },
          "descriptions": {
            "default": true,
            "description": "Bring over descriptions",
            "type": "boolean"
          },
          "favorites": {
            "default": true,
            "description": "Bring over favorites",
            "type": "boolean"
          },
          "locations": {
            "default": true,
            "description": "Bring over locations",
            "type": "boolean"
          },
          "selectedAlbums": {
            "description": "Album folders to recreate; omitted means every folder that is not a year folder",
            "items": {
              "maxLength": 4096,
              "type": "string"
            },
            "maxItems": 20000,
            "type": "array"
          },
          "sidecarReview": {
            "default": true,
            "description": "Hold items whose metadata sidecars disagree for a decision; off imports them without a sidecar",
            "type": "boolean"
          },
          "updateMatchedMetadata": {
            "default": false,
            "description": "Fill metadata missing from photos already in the library; values already there are never replaced",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "TakeoutItemsResponseDto": {
        "properties": {
          "hiddenLocked": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/TakeoutItemResponseDto"
            },
            "type": "array"
          },
          "total": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "hiddenLocked",
          "items",
          "total"
        ],
        "type": "object"
      },
      "TakeoutItemResponseDto": {
        "properties": {
          "albums": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "assetId": {
            "description": "The library item it became or matched, when this session may open it",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "candidates": {
            "items": {
              "$ref": "#/components/schemas/TakeoutSidecarCandidateDto"
            },
            "type": "array"
          },
          "error": {
            "nullable": true,
            "type": "string"
          },
          "folder": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/TakeoutItemKind"
          },
          "locked": {
            "type": "boolean"
          },
          "metadata": {
            "$ref": "#/components/schemas/TakeoutMetadataDto"
          },
          "path": {
            "description": "Path inside the export",
            "type": "string"
          },
          "sidecarId": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "size": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "source": {
            "description": "The archive or directory the file came from",
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/TakeoutItemState"
          },
          "warnings": {
            "items": {
              "$ref": "#/components/schemas/TakeoutWarning"
            },
            "type": "array"
          }
        },
        "required": [
          "albums",
          "assetId",
          "candidates",
          "error",
          "folder",
          "id",
          "kind",
          "locked",
          "metadata",
          "path",
          "sidecarId",
          "size",
          "source",
          "state",
          "warnings"
        ],
        "type": "object"
      },
      "TakeoutWarning": {
        "description": "Why an item needs attention",
        "enum": [
          "ambiguous_sidecar",
          "no_sidecar",
          "invalid_sidecar",
          "trashed",
          "locked"
        ],
        "type": "string"
      },
      "TakeoutItemState": {
        "description": "What happened to one photo or video",
        "enum": [
          "ready",
          "review",
          "importing",
          "imported",
          "matched",
          "skipped",
          "failed"
        ],
        "type": "string"
      },
      "TakeoutMetadataDto": {
        "properties": {
          "archived": {
            "description": "Archived in Google Photos",
            "type": "boolean"
          },
          "createdAt": {
            "description": "When Google Photos received the photo (ISO 8601)",
            "type": "string"
          },
          "description": {
            "description": "Description",
            "type": "string"
          },
          "favorite": {
            "description": "Favorite in Google Photos",
            "type": "boolean"
          },
          "latitude": {
            "description": "Latitude",
            "format": "double",
            "type": "number"
          },
          "locked": {
            "description": "In the Google Photos Locked Folder; imported into Locked",
            "type": "boolean"
          },
          "longitude": {
            "description": "Longitude",
            "format": "double",
            "type": "number"
          },
          "takenAt": {
            "description": "When the photo was taken (ISO 8601)",
            "type": "string"
          },
          "title": {
            "description": "File name Google Photos recorded",
            "type": "string"
          },
          "trashed": {
            "description": "In the Google Photos trash; not imported",
            "type": "boolean"
          }
        },
        "required": [
          "title"
        ],
        "type": "object"
      },
      "TakeoutItemKind": {
        "description": "Photo or video",
        "enum": [
          "image",
          "video"
        ],
        "type": "string"
      },
      "TakeoutSidecarCandidateDto": {
        "properties": {
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "metadata": {
            "$ref": "#/components/schemas/TakeoutMetadataDto"
          },
          "path": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "metadata",
          "path"
        ],
        "type": "object"
      },
      "TakeoutResolveDto": {
        "properties": {
          "sidecarId": {
            "description": "The sidecar to use; null imports without one",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "skip": {
            "description": "True leaves the item out of the import; false brings it back",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "TakeoutPairsResponseDto": {
        "properties": {
          "pairs": {
            "items": {
              "$ref": "#/components/schemas/TakeoutPairResponseDto"
            },
            "type": "array"
          },
          "total": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "pairs",
          "total"
        ],
        "type": "object"
      },
      "TakeoutPairResponseDto": {
        "properties": {
          "error": {
            "nullable": true,
            "type": "string"
          },
          "photoItemId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "photoPath": {
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/TakeoutPairState"
          },
          "videoItemId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "videoPath": {
            "type": "string"
          }
        },
        "required": [
          "error",
          "photoItemId",
          "photoPath",
          "state",
          "videoItemId",
          "videoPath"
        ],
        "type": "object"
      },
      "TakeoutPairState": {
        "description": "A possible Live Photo pair and the owner’s decision",
        "enum": [
          "suggested",
          "approved",
          "skipped",
          "linked",
          "failed"
        ],
        "type": "string"
      },
      "TakeoutPairDecisionDto": {
        "properties": {
          "approve": {
            "description": "True links them as one Live Photo; false keeps them separate",
            "type": "boolean"
          },
          "photoItemId": {
            "description": "The still photo",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "videoItemId": {
            "description": "The motion video",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          }
        },
        "required": [
          "approve",
          "photoItemId",
          "videoItemId"
        ],
        "type": "object"
      },
      "TimeBucketAssetResponseDto": {
        "properties": {
          "city": {
            "description": "Array of city names extracted from EXIF GPS data",
            "items": {
              "nullable": true,
              "type": "string"
            },
            "type": "array"
          },
          "country": {
            "description": "Array of country names extracted from EXIF GPS data",
            "items": {
              "nullable": true,
              "type": "string"
            },
            "type": "array"
          },
          "createdAt": {
            "description": "Array of UTC timestamps when each asset was originally uploaded to Frameleaf",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "duration": {
            "description": "Array of video/gif durations in milliseconds (null for static images)",
            "items": {
              "maximum": 2147483647,
              "minimum": 0,
              "nullable": true,
              "type": "integer"
            },
            "type": "array"
          },
          "fileCreatedAt": {
            "description": "Array of file creation timestamps in UTC",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "fileSizeInByte": {
            "description": "Array of file sizes in bytes (null when unknown). Omitted for shared links that hide EXIF",
            "items": {
              "maximum": 9007199254740991,
              "minimum": -9007199254740991,
              "nullable": true,
              "type": "integer"
            },
            "type": "array"
          },
          "height": {
            "description": "Array of heights in pixels (null when unknown). Omitted for shared links that hide EXIF",
            "items": {
              "maximum": 2147483647,
              "minimum": -2147483648,
              "nullable": true,
              "type": "integer"
            },
            "type": "array"
          },
          "id": {
            "description": "Array of asset IDs in the time bucket",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "isFavorite": {
            "description": "Array indicating whether each asset is favorited",
            "items": {
              "type": "boolean"
            },
            "type": "array"
          },
          "isImage": {
            "description": "Array indicating whether each asset is an image (false for videos)",
            "items": {
              "type": "boolean"
            },
            "type": "array"
          },
          "isOffline": {
            "description": "Array indicating whether each asset is offline (its file is missing from an external library)",
            "items": {
              "type": "boolean"
            },
            "type": "array"
          },
          "isTrashed": {
            "description": "Array indicating whether each asset is in the trash",
            "items": {
              "type": "boolean"
            },
            "type": "array"
          },
          "latitude": {
            "description": "Array of latitude coordinates extracted from EXIF GPS data",
            "items": {
              "format": "double",
              "nullable": true,
              "type": "number"
            },
            "type": "array"
          },
          "livePhotoVideoId": {
            "description": "Array of live photo video asset IDs (null for non-live photos)",
            "items": {
              "nullable": true,
              "type": "string"
            },
            "type": "array"
          },
          "localOffsetHours": {
            "description": "Array of UTC offset hours at the time each photo was taken. Positive values are east of UTC, negative values are west of UTC. Values may be fractional (e.g., 5.5 for +05:30, -9.75 for -09:45). Applying this offset to 'fileCreatedAt' will give you the time the photo was taken from the photographer's perspective.",
            "items": {
              "format": "double",
              "type": "number"
            },
            "type": "array"
          },
          "lockReason": {
            "description": "Why each asset is locked, or null when it is not. Returned with visibility LOCKED and for the timeline of an elevated owner, which reveals their marked and detected items",
            "items": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/AssetLockReason"
                }
              ],
              "nullable": true
            },
            "type": "array"
          },
          "longitude": {
            "description": "Array of longitude coordinates extracted from EXIF GPS data",
            "items": {
              "format": "double",
              "nullable": true,
              "type": "number"
            },
            "type": "array"
          },
          "originalFileName": {
            "description": "Array of original file names. Omitted for shared links that hide EXIF",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "ownerId": {
            "description": "Array of owner IDs for each asset",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "projectionType": {
            "description": "Array of projection types for 360° content (e.g., \"EQUIRECTANGULAR\", \"CUBEFACE\", \"CYLINDRICAL\")",
            "items": {
              "nullable": true,
              "type": "string"
            },
            "type": "array"
          },
          "rating": {
            "description": "Array of star ratings from EXIF (-1 rejected, 0 unrated, 1-5 stars; null when unknown). Omitted for shared links that hide EXIF",
            "items": {
              "maximum": 5,
              "minimum": -1,
              "nullable": true,
              "type": "integer"
            },
            "type": "array"
          },
          "ratio": {
            "description": "Array of aspect ratios (width/height) for each asset",
            "items": {
              "format": "double",
              "type": "number"
            },
            "type": "array"
          },
          "stack": {
            "description": "Array of stack information as [stackId, assetCount] tuples (null for non-stacked assets)",
            "items": {
              "items": {
                "type": "string"
              },
              "maxItems": 2,
              "minItems": 2,
              "nullable": true,
              "type": "array"
            },
            "type": "array"
          },
          "thumbhash": {
            "description": "Array of BlurHash strings for generating asset previews (base64 encoded)",
            "items": {
              "nullable": true,
              "type": "string"
            },
            "type": "array"
          },
          "visibility": {
            "description": "Array of visibility statuses for each asset (e.g., ARCHIVE, TIMELINE, HIDDEN, LOCKED)",
            "items": {
              "$ref": "#/components/schemas/AssetVisibility"
            },
            "type": "array"
          },
          "width": {
            "description": "Array of widths in pixels (null when unknown). Omitted for shared links that hide EXIF",
            "items": {
              "maximum": 2147483647,
              "minimum": -2147483648,
              "nullable": true,
              "type": "integer"
            },
            "type": "array"
          }
        },
        "required": [
          "createdAt",
          "duration",
          "fileCreatedAt",
          "id",
          "isFavorite",
          "isImage",
          "isTrashed",
          "livePhotoVideoId",
          "localOffsetHours",
          "ownerId",
          "projectionType",
          "ratio",
          "thumbhash",
          "visibility"
        ],
        "type": "object"
      },
      "AssetLockReason": {
        "description": "Why an asset is locked",
        "enum": [
          "marked",
          "detected",
          "immich-locked-folder"
        ],
        "type": "string"
      },
      "AssetOrderBy": {
        "description": "Asset sorting property",
        "enum": [
          "takenAt",
          "createdAt"
        ],
        "type": "string"
      },
      "TimeBucketDateType": {
        "description": "Date source for timeline bucket grouping",
        "enum": [
          "added",
          "taken"
        ],
        "type": "string"
      },
      "TimeBucketsResponseDto": {
        "properties": {
          "count": {
            "description": "Number of assets in this time bucket",
            "example": 42,
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "timeBucket": {
            "description": "Time bucket identifier in YYYY-MM-DD format representing the start of the time period",
            "example": "2024-01-01",
            "type": "string"
          }
        },
        "required": [
          "count",
          "timeBucket"
        ],
        "type": "object"
      },
      "TimelineHighlightResponseDto": {
        "properties": {
          "count": {
            "description": "Number of assets in this year or month, the same as the time buckets report",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "highlightAssetIds": {
            "description": "The next best assets in capture order (month cards only), never including the key photo",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "keyAssetId": {
            "description": "Key photo: highest Best Photos score, then highest star rating, then most recent capture",
            "nullable": true,
            "type": "string"
          },
          "places": {
            "description": "Up to three most frequent places (city, else state, else country), busiest first. Empty when the viewer may not see locations",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "timeBucket": {
            "description": "First day of the year or month in YYYY-MM-DD format, as in GET /timeline/buckets",
            "example": "2024-01-01",
            "type": "string"
          }
        },
        "required": [
          "count",
          "highlightAssetIds",
          "keyAssetId",
          "places",
          "timeBucket"
        ],
        "type": "object"
      },
      "TimelineHighlightGrouping": {
        "default": "month",
        "description": "One card per year or per month",
        "enum": [
          "year",
          "month"
        ],
        "type": "string"
      },
      "TimelineOrderedSort": {
        "description": "filename: by original file name (locale-aware), then newest capture; rating: highest star rating first (unrated counts as 0), then newest capture",
        "enum": [
          "filename",
          "rating"
        ],
        "type": "string"
      },
      "UtilityActivityResponseDto": {
        "properties": {
          "entries": {
            "description": "Newest first",
            "items": {
              "$ref": "#/components/schemas/UtilityActivityEntryDto"
            },
            "type": "array"
          }
        },
        "required": [
          "entries"
        ],
        "type": "object"
      },
      "UtilityActivityEntryDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/UtilityActivityAction"
          },
          "bytes": {
            "description": "Combined size of the items listed below, in bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "createdAt": {
            "description": "When the change was made",
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "description": "Entry ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "itemCount": {
            "description": "Items listed below",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/UtilityActivityItemDto"
            },
            "type": "array"
          },
          "unavailableCount": {
            "description": "Items of this change no longer shown: permanently deleted, or not visible to this session",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "action",
          "bytes",
          "createdAt",
          "id",
          "itemCount",
          "items",
          "unavailableCount"
        ],
        "type": "object"
      },
      "UtilityActivityItemDto": {
        "properties": {
          "assetId": {
            "description": "Asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "bytes": {
            "description": "Size of the original when it was moved, in bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "fileName": {
            "description": "Original file name",
            "type": "string"
          }
        },
        "required": [
          "assetId",
          "bytes",
          "fileName"
        ],
        "type": "object"
      },
      "UtilityActivityAction": {
        "description": "A move to the trash, or its undo",
        "enum": [
          "trash",
          "restore"
        ],
        "type": "string"
      },
      "UtilityActivityTool": {
        "description": "The utility whose activity history this is",
        "enum": [
          "large-files"
        ],
        "type": "string"
      },
      "TrashResponseDto": {
        "properties": {
          "count": {
            "description": "Number of items in trash",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "type": "object"
      },
      "TrashApplyDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/TrashReviewAction"
          },
          "ids": {
            "description": "The chosen items, for trash, restore and delete. Ignored by restore-all and empty.",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 50000,
            "type": "array"
          },
          "source": {
            "$ref": "#/components/schemas/UtilityActivityTool",
            "description": "The utility the change was made from. A move to the trash or a restore from Large files is kept in its activity history."
          },
          "token": {
            "description": "The token returned by the review",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "action",
          "token"
        ],
        "type": "object"
      },
      "TrashReviewAction": {
        "description": "A reviewed change to items in, or into, the trash",
        "enum": [
          "trash",
          "restore",
          "restore-all",
          "delete",
          "empty"
        ],
        "type": "string"
      },
      "TrashItemsResponseDto": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/TrashItemResponseDto"
            },
            "type": "array"
          },
          "nextPage": {
            "description": "The next page number, or null on the last page",
            "nullable": true,
            "type": "string"
          },
          "total": {
            "description": "Items matching the filters",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "items",
          "nextPage",
          "total"
        ],
        "type": "object"
      },
      "TrashItemResponseDto": {
        "properties": {
          "fileSizeInByte": {
            "description": "Size of the original, in bytes, when known",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "id": {
            "description": "Asset ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "isLocked": {
            "description": "Locked media; only listed for its owner in an unlocked session",
            "type": "boolean"
          },
          "isOffline": {
            "description": "The library scan found this external original missing and manages it; trash actions do not change it",
            "type": "boolean"
          },
          "originalFileName": {
            "description": "Original file name",
            "type": "string"
          },
          "trashedAt": {
            "description": "When the item was moved to the trash",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/AssetTypeEnum"
          }
        },
        "required": [
          "fileSizeInByte",
          "id",
          "isLocked",
          "isOffline",
          "originalFileName",
          "trashedAt",
          "type"
        ],
        "type": "object"
      },
      "TrashItemSort": {
        "description": "Trash order: most recently deleted, largest original, or file name",
        "enum": [
          "recent",
          "size",
          "name"
        ],
        "type": "string"
      },
      "TrashReviewResponseDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/TrashReviewAction"
          },
          "bytes": {
            "description": "Combined size of their originals, in bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "count": {
            "description": "Items the action will change",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "names": {
            "description": "The first file names, alphabetically",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "retainedBytes": {
            "description": "Size of those shared originals, in bytes",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "retainedOriginals": {
            "description": "Items whose original another item still uses; deleting them does not free that file",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "token": {
            "description": "Fingerprint of the reviewed set; apply refuses when the set has changed",
            "type": "string"
          }
        },
        "required": [
          "action",
          "bytes",
          "count",
          "names",
          "retainedBytes",
          "retainedOriginals",
          "token"
        ],
        "type": "object"
      },
      "TrashReviewDto": {
        "properties": {
          "action": {
            "$ref": "#/components/schemas/TrashReviewAction"
          },
          "ids": {
            "description": "The chosen items, for trash, restore and delete. Ignored by restore-all and empty.",
            "items": {
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
              "type": "string"
            },
            "maxItems": 50000,
            "type": "array"
          }
        },
        "required": [
          "action"
        ],
        "type": "object"
      },
      "TrashSummaryResponseDto": {
        "properties": {
          "bytes": {
            "description": "Combined size of their originals, in bytes. Not the space deleting them frees.",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "count": {
            "description": "Items in your trash this session can see",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "offline": {
            "description": "Of those, external-library originals that went missing; the library scan manages them",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "pendingDeletion": {
            "description": "Items already permanently deleted whose files are still being removed from storage",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "bytes",
          "count",
          "offline",
          "pendingDeletion"
        ],
        "type": "object"
      },
      "BackupDeviceWriteDto": {
        "properties": {
          "appVersion": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "deviceKey": {
            "description": "Stable random client device identity, scoped to this owner",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "displayName": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "lastSuccessfulBackupAt": {
            "description": "Device-reported success; not server verification",
            "format": "date-time",
            "nullable": true,
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "type": "string"
          },
          "model": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "pendingCount": {
            "maximum": 2147483647,
            "minimum": 0,
            "type": "integer"
          },
          "platform": {
            "maxLength": 50,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "appVersion",
          "deviceKey",
          "displayName",
          "lastSuccessfulBackupAt",
          "model",
          "pendingCount",
          "platform"
        ],
        "type": "object"
      },
      "ReconciliationHistoryDto": {
        "properties": {
          "nextOffset": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "nullable": true,
            "type": "integer"
          },
          "runs": {
            "items": {
              "properties": {
                "checkedAt": {
                  "description": "Inventory snapshot time, not a promise after commit",
                  "format": "date-time",
                  "type": "string"
                },
                "completedAt": {
                  "format": "date-time",
                  "nullable": true,
                  "type": "string"
                },
                "deviceId": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                  "type": "string"
                },
                "differingBuckets": {
                  "items": {
                    "maximum": 9007199254740991,
                    "minimum": -9007199254740991,
                    "type": "integer"
                  },
                  "type": "array"
                },
                "evidence": {
                  "description": "Current database inventory, excludes offline/last-checked-missing; not a fresh filesystem integrity check",
                  "enum": [
                    "registered-current-originals"
                  ],
                  "type": "string"
                },
                "id": {
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                  "type": "string"
                },
                "itemsChecked": {
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "type": "integer"
                },
                "itemsMissing": {
                  "description": "Provided SHA256 hashes absent from current registered inventory; not a filesystem loss diagnosis",
                  "maximum": 9007199254740991,
                  "minimum": -9007199254740991,
                  "type": "integer"
                },
                "pendingBuckets": {
                  "items": {
                    "maximum": 9007199254740991,
                    "minimum": -9007199254740991,
                    "type": "integer"
                  },
                  "type": "array"
                },
                "startedAt": {
                  "format": "date-time",
                  "type": "string"
                }
              },
              "required": [
                "id",
                "deviceId",
                "startedAt",
                "checkedAt",
                "completedAt",
                "differingBuckets",
                "pendingBuckets",
                "itemsChecked",
                "itemsMissing",
                "evidence"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "nextOffset",
          "runs"
        ],
        "type": "object"
      },
      "ReconciliationResultDto": {
        "properties": {
          "checkedAt": {
            "description": "Inventory snapshot time, not a promise after commit",
            "format": "date-time",
            "type": "string"
          },
          "completedAt": {
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "deviceId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "differingBuckets": {
            "items": {
              "maximum": 9007199254740991,
              "minimum": -9007199254740991,
              "type": "integer"
            },
            "type": "array"
          },
          "evidence": {
            "description": "Current database inventory, excludes offline/last-checked-missing; not a fresh filesystem integrity check",
            "enum": [
              "registered-current-originals"
            ],
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "itemsChecked": {
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "itemsMissing": {
            "description": "Provided SHA256 hashes absent from current registered inventory; not a filesystem loss diagnosis",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "type": "integer"
          },
          "missingHashes": {
            "items": {
              "pattern": "^[a-f\\d]{64}$",
              "type": "string"
            },
            "type": "array"
          },
          "pendingBuckets": {
            "items": {
              "maximum": 9007199254740991,
              "minimum": -9007199254740991,
              "type": "integer"
            },
            "type": "array"
          },
          "startedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "checkedAt",
          "completedAt",
          "deviceId",
          "differingBuckets",
          "evidence",
          "id",
          "itemsChecked",
          "itemsMissing",
          "missingHashes",
          "pendingBuckets",
          "startedAt"
        ],
        "type": "object"
      },
      "ReconciliationStartDto": {
        "properties": {
          "buckets": {
            "description": "First byte buckets in index order. Digest SHA256 of sorted distinct raw32-byte hashes; empty digest SHA256(empty). Maximum2000 hashes per bucket; larger sets refused.",
            "items": {
              "properties": {
                "count": {
                  "maximum": 2000,
                  "minimum": 0,
                  "type": "integer"
                },
                "digest": {
                  "pattern": "^[a-f\\d]{64}$",
                  "type": "string"
                }
              },
              "required": [
                "count",
                "digest"
              ],
              "type": "object"
            },
            "maxItems": 256,
            "minItems": 256,
            "type": "array"
          }
        },
        "required": [
          "buckets"
        ],
        "type": "object"
      },
      "ReconciliationBucketDto": {
        "properties": {
          "bucket": {
            "maximum": 255,
            "minimum": 0,
            "type": "integer"
          },
          "hashes": {
            "items": {
              "pattern": "^[a-f\\d]{64}$",
              "type": "string"
            },
            "maxItems": 2000,
            "type": "array"
          }
        },
        "required": [
          "bucket",
          "hashes"
        ],
        "type": "object"
      },
      "OnboardingResponseDto": {
        "properties": {
          "isOnboarded": {
            "description": "Is user onboarded",
            "type": "boolean"
          }
        },
        "required": [
          "isOnboarded"
        ],
        "type": "object"
      },
      "OnboardingDto": {
        "properties": {
          "isOnboarded": {
            "description": "Is user onboarded",
            "type": "boolean"
          }
        },
        "required": [
          "isOnboarded"
        ],
        "type": "object"
      },
      "PinnedCollectionsResponseDto": {
        "properties": {
          "pins": {
            "description": "Complete replacement snapshot in user order, including unavailable pins",
            "items": {
              "$ref": "#/components/schemas/PinnedCollection"
            },
            "type": "array"
          },
          "revision": {
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          }
        },
        "required": [
          "pins",
          "revision"
        ],
        "type": "object"
      },
      "PinnedCollection": {
        "properties": {
          "count": {
            "description": "Current access-filtered item count; null when unavailable",
            "maximum": 9007199254740991,
            "minimum": 0,
            "nullable": true,
            "type": "integer"
          },
          "countCapped": {
            "description": "Whether a semantic saved-search count reached the existing smart-search cap",
            "type": "boolean"
          },
          "coverAssetId": {
            "description": "Current readable cover asset; null when unavailable or empty",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "kind": {
            "enum": [
              "album",
              "smart-album",
              "saved-search",
              "person",
              "pet",
              "memory",
              "builtin"
            ],
            "type": "string"
          },
          "targetId": {
            "description": "Null when unavailable; the inaccessible target identity is not disclosed",
            "nullable": true,
            "type": "string"
          },
          "title": {
            "description": "Current access-filtered title; null when unavailable",
            "nullable": true,
            "type": "string"
          },
          "unavailable": {
            "type": "boolean"
          }
        },
        "required": [
          "count",
          "countCapped",
          "coverAssetId",
          "id",
          "kind",
          "targetId",
          "title",
          "unavailable"
        ],
        "type": "object"
      },
      "PinnedCollectionsUpdateDto": {
        "additionalProperties": false,
        "properties": {
          "expectedRevision": {
            "description": "Revision returned by GET; null only when no pin list exists. A stale save returns 409",
            "format": "uuid",
            "nullable": true,
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "pins": {
            "description": "Replace the complete ordered list to add, remove or reorder pins; an empty list clears it",
            "items": {
              "$ref": "#/components/schemas/PinnedCollectionRef"
            },
            "maxItems": 50,
            "type": "array"
          }
        },
        "required": [
          "expectedRevision",
          "pins"
        ],
        "type": "object"
      },
      "PinnedCollectionRef": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "Opaque pin ID chosen by the client and retained across reorders",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "kind": {
            "enum": [
              "album",
              "smart-album",
              "saved-search",
              "person",
              "pet",
              "memory",
              "builtin"
            ],
            "type": "string"
          },
          "targetId": {
            "description": "Target UUID, saved-search name, or built-in ID. Null retains an existing unavailable pin by its opaque ID",
            "maxLength": 100,
            "minLength": 1,
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "id",
          "kind",
          "targetId"
        ],
        "type": "object"
      },
      "UserPreferenceHistoryResponseDto": {
        "properties": {
          "entries": {
            "description": "The newest preference changes first",
            "items": {
              "$ref": "#/components/schemas/UserPreferenceHistoryEntryDto"
            },
            "type": "array"
          }
        },
        "required": [
          "entries"
        ],
        "type": "object"
      },
      "UserPreferenceHistoryEntryDto": {
        "properties": {
          "changes": {
            "description": "Every changed preference",
            "items": {
              "$ref": "#/components/schemas/UserPreferenceHistoryChangeDto"
            },
            "type": "array"
          },
          "createdAt": {
            "description": "When the change was saved",
            "format": "date-time",
            "type": "string"
          },
          "deviceLabel": {
            "description": "The device that saved it, such as \"macOS · Web\"",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "Entry ID",
            "type": "string"
          },
          "omittedChanges": {
            "description": "Changed preferences left out because the entry reached its limit",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "changes",
          "createdAt",
          "deviceLabel",
          "id",
          "omittedChanges"
        ],
        "type": "object"
      },
      "UserPreferenceHistoryChangeDto": {
        "properties": {
          "after": {
            "description": "The value after, JSON encoded; null when protected",
            "nullable": true,
            "type": "string"
          },
          "before": {
            "description": "The value before, JSON encoded; null when protected",
            "nullable": true,
            "type": "string"
          },
          "path": {
            "description": "The changed preference, as a dotted path such as memories.enabled",
            "type": "string"
          },
          "protected": {
            "description": "Changed, but its values are not recorded (Locked content)",
            "type": "boolean"
          }
        },
        "required": [
          "after",
          "before",
          "path"
        ],
        "type": "object"
      },
      "CreateProfileImageResponseDto": {
        "properties": {
          "profileChangedAt": {
            "description": "Profile image change date",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "profileImagePath": {
            "description": "Profile image file path",
            "type": "string"
          },
          "userId": {
            "description": "User ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          }
        },
        "required": [
          "profileChangedAt",
          "profileImagePath",
          "userId"
        ],
        "type": "object"
      },
      "CreateProfileImageDto": {
        "properties": {
          "assetId": {
            "description": "ID of the photo the image was copied from, if any. A Locked photo is refused.",
            "format": "uuid",
            "type": "string"
          },
          "file": {
            "description": "Profile image file",
            "format": "binary",
            "type": "string"
          },
          "keepSource": {
            "description": "The image is a new crop of the current profile picture: keep the photo it was copied from, if any. Ignored when assetId is set.",
            "type": "boolean"
          }
        },
        "required": [
          "file"
        ],
        "type": "object"
      },
      "FolderSummaryResponseDto": {
        "properties": {
          "count": {
            "description": "Originals directly in this folder",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "path": {
            "description": "Folder path, without a trailing slash",
            "type": "string"
          },
          "size": {
            "description": "Bytes of the originals directly in this folder",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "count",
          "path",
          "size"
        ],
        "type": "object"
      },
      "WorkflowResponseDto": {
        "properties": {
          "createdAt": {
            "description": "Creation date",
            "type": "string"
          },
          "description": {
            "description": "Workflow description",
            "nullable": true,
            "type": "string"
          },
          "enabled": {
            "description": "Workflow enabled",
            "type": "boolean"
          },
          "extra": {
            "additionalProperties": {},
            "description": "Additional fields of an imported definition, kept and exported unchanged",
            "type": "object"
          },
          "id": {
            "description": "Workflow ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "issues": {
            "description": "What prevents this definition from running on this server; empty when it can run",
            "items": {
              "$ref": "#/components/schemas/WorkflowIssueDto"
            },
            "type": "array"
          },
          "logging": {
            "description": "Workflow logs run results",
            "type": "boolean"
          },
          "name": {
            "description": "Workflow name",
            "nullable": true,
            "type": "string"
          },
          "steps": {
            "description": "Workflow steps",
            "items": {
              "$ref": "#/components/schemas/WorkflowStepResponseDto"
            },
            "type": "array"
          },
          "trigger": {
            "description": "Workflow trigger type",
            "type": "string"
          },
          "updatedAt": {
            "description": "Update date",
            "type": "string"
          }
        },
        "required": [
          "createdAt",
          "description",
          "enabled",
          "extra",
          "id",
          "issues",
          "logging",
          "name",
          "steps",
          "trigger",
          "updatedAt"
        ],
        "type": "object"
      },
      "WorkflowStepResponseDto": {
        "properties": {
          "config": {
            "additionalProperties": {},
            "description": "Step configuration, without stored credential values",
            "nullable": true,
            "type": "object"
          },
          "enabled": {
            "description": "Step is enabled",
            "type": "boolean"
          },
          "extra": {
            "additionalProperties": {},
            "description": "Additional fields of an imported definition, kept and exported unchanged",
            "type": "object"
          },
          "id": {
            "description": "Step ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "method": {
            "description": "Step plugin method, as plugin#method",
            "type": "string"
          },
          "storedSecrets": {
            "description": "Configuration paths (keys joined with \".\") holding a stored credential that is never returned",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "config",
          "enabled",
          "extra",
          "id",
          "method",
          "storedSecrets"
        ],
        "type": "object"
      },
      "WorkflowIssueDto": {
        "properties": {
          "code": {
            "$ref": "#/components/schemas/WorkflowIssueCode"
          },
          "message": {
            "description": "What prevents the workflow from running",
            "type": "string"
          },
          "step": {
            "description": "Index of the step the issue belongs to",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "code",
          "message"
        ],
        "type": "object"
      },
      "WorkflowIssueCode": {
        "description": "Why a workflow definition cannot run",
        "enum": [
          "trigger_unavailable",
          "method_unavailable",
          "method_incompatible",
          "config_invalid"
        ],
        "type": "string"
      },
      "WorkflowCreateDto": {
        "properties": {
          "description": {
            "description": "Workflow description",
            "maxLength": 2000,
            "nullable": true,
            "type": "string"
          },
          "enabled": {
            "description": "Workflow enabled",
            "type": "boolean"
          },
          "extra": {
            "additionalProperties": {},
            "description": "Additional fields of an imported definition, kept and exported unchanged",
            "type": "object"
          },
          "logging": {
            "description": "Workflow logs run results",
            "type": "boolean"
          },
          "name": {
            "description": "Workflow name",
            "maxLength": 300,
            "nullable": true,
            "type": "string"
          },
          "steps": {
            "items": {
              "$ref": "#/components/schemas/WorkflowStepDto"
            },
            "maxItems": 100,
            "type": "array"
          },
          "trigger": {
            "description": "Workflow trigger type. An unavailable trigger is kept, but the workflow cannot be enabled",
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "trigger"
        ],
        "type": "object"
      },
      "WorkflowStepDto": {
        "properties": {
          "config": {
            "additionalProperties": {},
            "description": "Step configuration",
            "nullable": true,
            "type": "object"
          },
          "enabled": {
            "description": "Step is enabled",
            "type": "boolean"
          },
          "extra": {
            "additionalProperties": {},
            "description": "Additional fields of an imported definition, kept and exported unchanged",
            "type": "object"
          },
          "id": {
            "description": "Step ID from a previous response. A credential left out of its configuration keeps its stored value",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "method": {
            "description": "Step plugin method, as plugin#method",
            "maxLength": 300,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "config",
          "method"
        ],
        "type": "object"
      },
      "WorkflowTriggerResponseDto": {
        "properties": {
          "trigger": {
            "$ref": "#/components/schemas/WorkflowTrigger",
            "description": "Trigger type"
          },
          "types": {
            "description": "Workflow types",
            "items": {
              "$ref": "#/components/schemas/WorkflowType"
            },
            "type": "array"
          }
        },
        "required": [
          "trigger",
          "types"
        ],
        "type": "object"
      },
      "WorkflowUpdateDto": {
        "properties": {
          "description": {
            "description": "Workflow description",
            "maxLength": 2000,
            "nullable": true,
            "type": "string"
          },
          "enabled": {
            "description": "Workflow enabled",
            "type": "boolean"
          },
          "extra": {
            "additionalProperties": {},
            "description": "Additional fields of an imported definition, kept and exported unchanged",
            "type": "object"
          },
          "logging": {
            "description": "Workflow logs run results",
            "type": "boolean"
          },
          "name": {
            "description": "Workflow name",
            "maxLength": 300,
            "nullable": true,
            "type": "string"
          },
          "steps": {
            "items": {
              "$ref": "#/components/schemas/WorkflowStepDto"
            },
            "maxItems": 100,
            "type": "array"
          },
          "trigger": {
            "description": "Workflow trigger type. An unavailable trigger is kept, but the workflow cannot be enabled",
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          }
        },
        "type": "object"
      },
      "WorkflowLogEntryDto": {
        "properties": {
          "at": {
            "description": "Workflow run date/time",
            "example": "2024-01-01T00:00:00.000Z",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
            "type": "string"
          },
          "attempt": {
            "description": "0 for the first attempt, 1 for the automatic retry, then manual retries",
            "maximum": 9007199254740991,
            "minimum": 0,
            "type": "integer"
          },
          "error": {
            "description": "Why the run failed, without stored credentials",
            "type": "string"
          },
          "errorCode": {
            "$ref": "#/components/schemas/WorkflowRunErrorCode"
          },
          "id": {
            "description": "Workflow log entry ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
            "type": "string"
          },
          "lastStep": {
            "description": "Last step ran, if the workflow ended early",
            "properties": {
              "index": {
                "description": "Index of the step in the workflow",
                "maximum": 9007199254740991,
                "minimum": 0,
                "type": "integer"
              },
              "method": {
                "description": "Method of the step",
                "type": "string"
              }
            },
            "required": [
              "method",
              "index"
            ],
            "type": "object"
          },
          "result": {
            "$ref": "#/components/schemas/WorkflowResult"
          },
          "runId": {
            "description": "Run ID shared by every attempt of one run",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "triggerDataId": {
            "description": "Workflow trigger data ID",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          }
        },
        "required": [
          "at",
          "attempt",
          "id",
          "result",
          "runId"
        ],
        "type": "object"
      },
      "WorkflowResult": {
        "description": "Workflow run result",
        "enum": [
          "completed",
          "halted",
          "error"
        ],
        "type": "string"
      },
      "WorkflowRunErrorCode": {
        "description": "Why a workflow run failed",
        "enum": [
          "unsupported",
          "step_failed"
        ],
        "type": "string"
      },
      "WorkflowShareResponseDto": {
        "properties": {
          "description": {
            "description": "Workflow description",
            "nullable": true,
            "type": "string"
          },
          "extra": {
            "additionalProperties": {},
            "description": "Additional fields of an imported definition, kept and exported unchanged",
            "type": "object"
          },
          "name": {
            "description": "Workflow name",
            "nullable": true,
            "type": "string"
          },
          "steps": {
            "description": "Workflow steps",
            "items": {
              "$ref": "#/components/schemas/WorkflowShareStepDto"
            },
            "type": "array"
          },
          "trigger": {
            "description": "Workflow trigger type",
            "type": "string"
          }
        },
        "required": [
          "description",
          "extra",
          "name",
          "steps",
          "trigger"
        ],
        "type": "object"
      },
      "WorkflowShareStepDto": {
        "properties": {
          "config": {
            "additionalProperties": {},
            "description": "Step configuration, without credentials",
            "nullable": true,
            "type": "object"
          },
          "enabled": {
            "description": "Step is enabled",
            "type": "boolean"
          },
          "extra": {
            "additionalProperties": {},
            "description": "Additional fields of an imported definition, kept and exported unchanged",
            "type": "object"
          },
          "method": {
            "description": "Step plugin method",
            "type": "string"
          }
        },
        "required": [
          "config",
          "extra",
          "method"
        ],
        "type": "object"
      }
    }
  }
}
