{
  "openapi": "3.1.0",
  "info": {
    "title": "Boita API",
    "version": "1.0.0",
    "description": "The Boita public API: files, transfers, share links, upload portals, delivery receipts, webhooks and usage for one workspace.\n\nAuthenticate with a workspace API key (`Authorization: Bearer boita_sk_…`) created on the Developers page. A key is bound to one workspace and carries scopes; each operation lists the scopes that allow it (any one is enough).\n\nErrors always look like `{ \"error\": { \"code\", \"message\", \"details\" } }`. Rate limit: 600 requests per minute per key (429 `rate_limited` beyond that).\n\nTransfers are never carried by this API: `POST …/transfers` returns a transfer spec for the transfer engine (the desktop app, the CLI agent or a gateway) to run.",
    "contact": {
      "name": "Boita support",
      "url": "https://boita.io/contact"
    }
  },
  "servers": [
    {
      "url": "https://api.boita.io/v1"
    }
  ],
  "tags": [
    {
      "name": "Files",
      "description": "Browse, search and organise the workspace"
    },
    {
      "name": "Transfers",
      "description": "Transfer specs and progress"
    },
    {
      "name": "Shares",
      "description": "Share links and recipient comments"
    },
    {
      "name": "Receipts",
      "description": "Delivery receipts, verification reports and delivery notes"
    },
    {
      "name": "Portals",
      "description": "Upload portals and the uploads they receive"
    },
    {
      "name": "Webhooks",
      "description": "Endpoints, deliveries and the signed event stream"
    },
    {
      "name": "Events",
      "description": "Polling alternative to webhooks"
    },
    {
      "name": "Usage",
      "description": "Storage and bandwidth figures"
    },
    {
      "name": "Cloud",
      "description": "Deliveries to connected Google Drive, Dropbox, OneDrive and Box folders"
    }
  ],
  "security": [
    {
      "apiKey": []
    }
  ],
  "paths": {
    "/workspaces/{workspaceId}/files": {
      "get": {
        "operationId": "files.list",
        "summary": "List a folder",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "list",
        "x-boita-scopes": [
          "files:read"
        ],
        "security": [
          {
            "apiKey": [
              "files:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "path",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 4096,
              "default": ""
            }
          },
          {
            "name": "skip",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          },
          {
            "name": "count",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 200
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FileListing"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      },
      "patch": {
        "operationId": "files.rename",
        "summary": "Rename a file or folder",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "rename",
        "x-boita-scopes": [
          "files:write"
        ],
        "security": [
          {
            "apiKey": [
              "files:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "path": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 4096
                  },
                  "newName": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 255
                  }
                },
                "required": [
                  "path",
                  "newName"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      },
      "delete": {
        "operationId": "files.delete",
        "summary": "Move files to the trash (or delete permanently)",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "delete",
        "x-boita-scopes": [
          "files:write"
        ],
        "security": [
          {
            "apiKey": [
              "files:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "paths": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 4096
                    },
                    "minItems": 1,
                    "maxItems": 500
                  },
                  "permanent": {
                    "type": "boolean",
                    "default": false
                  }
                },
                "required": [
                  "paths"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/files/search": {
      "get": {
        "operationId": "files.search",
        "summary": "Search files by name",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "search",
        "x-boita-scopes": [
          "files:read"
        ],
        "security": [
          {
            "apiKey": [
              "files:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "q",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            }
          },
          {
            "name": "path",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 4096,
              "default": ""
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/files/manifest": {
      "get": {
        "operationId": "files.manifest",
        "summary": "Every file under a folder with size and modification time (for sync clients)",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "manifest",
        "x-boita-scopes": [
          "files:read"
        ],
        "security": [
          {
            "apiKey": [
              "files:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "path",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 4096,
              "default": "",
              "description": "Workspace-relative folder; empty = the root"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "root": {
                      "type": "string"
                    },
                    "files": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "path": {
                            "type": "string"
                          },
                          "size": {
                            "type": "integer"
                          },
                          "modifiedAt": {
                            "type": [
                              "string",
                              "null"
                            ]
                          }
                        },
                        "required": [
                          "path",
                          "size",
                          "modifiedAt"
                        ]
                      }
                    },
                    "truncated": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "root",
                    "files",
                    "truncated"
                  ],
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/files/folder": {
      "post": {
        "operationId": "files.createFolder",
        "summary": "Create a folder",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "createFolder",
        "x-boita-scopes": [
          "files:write"
        ],
        "security": [
          {
            "apiKey": [
              "files:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "path": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 4096
                  }
                },
                "required": [
                  "path"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/files/trash": {
      "get": {
        "operationId": "files.listTrash",
        "summary": "List the trash",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "listTrash",
        "x-boita-scopes": [
          "files:read"
        ],
        "security": [
          {
            "apiKey": [
              "files:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TrashItem"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/files/trash/{itemId}/restore": {
      "post": {
        "operationId": "files.restoreFromTrash",
        "summary": "Restore a trashed item",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "restoreFromTrash",
        "x-boita-scopes": [
          "files:write"
        ],
        "security": [
          {
            "apiKey": [
              "files:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "itemId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/files/trash/{itemId}": {
      "delete": {
        "operationId": "files.purgeFromTrash",
        "summary": "Purge one trashed item now",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "purgeFromTrash",
        "x-boita-scopes": [
          "files:write"
        ],
        "security": [
          {
            "apiKey": [
              "files:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "itemId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/files/versions": {
      "get": {
        "operationId": "files.listVersions",
        "summary": "List kept versions of a file",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "listVersions",
        "x-boita-scopes": [
          "files:read"
        ],
        "security": [
          {
            "apiKey": [
              "files:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "path",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FileVersion"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/files/versions/{versionId}/restore": {
      "post": {
        "operationId": "files.restoreVersion",
        "summary": "Restore a kept version",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "restoreVersion",
        "x-boita-scopes": [
          "files:write"
        ],
        "security": [
          {
            "apiKey": [
              "files:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "versionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/files/preview": {
      "get": {
        "operationId": "files.preview",
        "summary": "Thumbnail of a file",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "preview",
        "x-boita-scopes": [
          "files:read"
        ],
        "security": [
          {
            "apiKey": [
              "files:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "path",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "image/jpeg": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/files/proxies": {
      "get": {
        "operationId": "files.proxyStatus",
        "summary": "Rendered proxies of a file",
        "description": "What the proxy pipeline has rendered for a file or a kept version (720p MP4, waveform, contact sheet, PDF pages), with its media kind and frame rate.",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "proxyStatus",
        "x-boita-scopes": [
          "files:read"
        ],
        "security": [
          {
            "apiKey": [
              "files:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "path",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 4096,
              "default": ""
            }
          },
          {
            "name": "version",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9]{10,40}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "media": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "enum": [
                        "video",
                        "audio",
                        "image",
                        "pdf"
                      ]
                    },
                    "fps": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "durationMs": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "proxies": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "enum": [
                              "proxy720",
                              "waveform",
                              "contact_sheet",
                              "page"
                            ]
                          },
                          "page": {
                            "type": "integer"
                          },
                          "status": {
                            "type": "string"
                          },
                          "width": {
                            "type": [
                              "integer",
                              "null"
                            ]
                          },
                          "height": {
                            "type": [
                              "integer",
                              "null"
                            ]
                          },
                          "durationMs": {
                            "type": [
                              "integer",
                              "null"
                            ]
                          },
                          "error": {
                            "type": [
                              "string",
                              "null"
                            ]
                          }
                        },
                        "required": [
                          "kind",
                          "page",
                          "status",
                          "width",
                          "height",
                          "durationMs",
                          "error"
                        ]
                      }
                    }
                  },
                  "required": [
                    "media",
                    "fps",
                    "durationMs",
                    "proxies"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      },
      "post": {
        "operationId": "files.renderProxies",
        "summary": "Render proxies now",
        "description": "Queues the proxies a file (or a kept version) needs. Video and audio queue on upload; images and PDFs render on demand.",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "renderProxies",
        "x-boita-scopes": [
          "files:write"
        ],
        "security": [
          {
            "apiKey": [
              "files:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "paths": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 4096
                    },
                    "maxItems": 50
                  },
                  "versions": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "pattern": "^[a-z0-9]{10,40}$"
                    },
                    "maxItems": 50
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "queued": {
                      "type": "integer"
                    }
                  },
                  "required": [
                    "queued"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/files/proxy": {
      "get": {
        "operationId": "files.proxy",
        "summary": "A rendered proxy (supports Range)",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "proxy",
        "x-boita-scopes": [
          "files:read"
        ],
        "security": [
          {
            "apiKey": [
              "files:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "path",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 4096,
              "default": "",
              "description": "Workspace-relative path; omit when `version` is given"
            }
          },
          {
            "name": "kind",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "proxy720",
                "waveform",
                "contact_sheet",
                "page"
              ]
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 50,
              "default": 0
            }
          },
          {
            "name": "version",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9]{10,40}$",
              "description": "A kept version id instead of the live file"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/files/operations": {
      "post": {
        "operationId": "files.createOperation",
        "summary": "Queue a server-side move or copy",
        "description": "The workers copy through the transfer engine, verify size and count, and delete the originals only then (move). Conflicts are refused unless `overwrite` is true; a selected frame of a numbered set takes the whole set unless `expandSequences` is false. Caps: 200 items and 500 GB per job (250 GB on plans without the feature).",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "createOperation",
        "x-boita-scopes": [
          "files:write"
        ],
        "security": [
          {
            "apiKey": [
              "files:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "kind": {
                    "type": "string",
                    "enum": [
                      "move",
                      "copy"
                    ]
                  },
                  "paths": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 4096
                    },
                    "minItems": 1,
                    "maxItems": 200
                  },
                  "destination": {
                    "type": "string",
                    "maxLength": 4096,
                    "default": ""
                  },
                  "overwrite": {
                    "type": "boolean",
                    "default": false
                  },
                  "expandSequences": {
                    "type": "boolean",
                    "default": true
                  }
                },
                "required": [
                  "kind",
                  "paths"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "kind": {
                      "type": "string",
                      "enum": [
                        "move",
                        "copy"
                      ]
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "queued",
                        "running",
                        "completed",
                        "failed",
                        "cancelled"
                      ]
                    },
                    "destination": {
                      "type": "string"
                    },
                    "overwrite": {
                      "type": "boolean"
                    },
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "path": {
                            "type": "string"
                          },
                          "type": {
                            "type": "string",
                            "enum": [
                              "file",
                              "folder"
                            ]
                          },
                          "bytes": {
                            "type": "number"
                          }
                        },
                        "required": [
                          "path",
                          "type",
                          "bytes"
                        ]
                      }
                    },
                    "filesTotal": {
                      "type": "integer"
                    },
                    "filesDone": {
                      "type": "integer"
                    },
                    "bytesTotal": {
                      "type": "number"
                    },
                    "bytesDone": {
                      "type": "number"
                    },
                    "error": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "createdAt": {
                      "type": "string",
                      "format": "date-time",
                      "description": "ISO 8601 timestamp"
                    },
                    "startedAt": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time",
                      "description": "ISO 8601 timestamp"
                    },
                    "finishedAt": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time",
                      "description": "ISO 8601 timestamp"
                    }
                  },
                  "required": [
                    "id",
                    "kind",
                    "status",
                    "destination",
                    "overwrite",
                    "items",
                    "filesTotal",
                    "filesDone",
                    "bytesTotal",
                    "bytesDone",
                    "error",
                    "createdAt",
                    "startedAt",
                    "finishedAt"
                  ],
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      },
      "get": {
        "operationId": "files.listOperations",
        "summary": "Move/copy jobs of the workspace",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "listOperations",
        "x-boita-scopes": [
          "files:read"
        ],
        "security": [
          {
            "apiKey": [
              "files:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "active",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "1",
                "true"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string"
                      },
                      "kind": {
                        "type": "string",
                        "enum": [
                          "move",
                          "copy"
                        ]
                      },
                      "status": {
                        "type": "string",
                        "enum": [
                          "queued",
                          "running",
                          "completed",
                          "failed",
                          "cancelled"
                        ]
                      },
                      "destination": {
                        "type": "string"
                      },
                      "overwrite": {
                        "type": "boolean"
                      },
                      "items": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "path": {
                              "type": "string"
                            },
                            "type": {
                              "type": "string",
                              "enum": [
                                "file",
                                "folder"
                              ]
                            },
                            "bytes": {
                              "type": "number"
                            }
                          },
                          "required": [
                            "path",
                            "type",
                            "bytes"
                          ]
                        }
                      },
                      "filesTotal": {
                        "type": "integer"
                      },
                      "filesDone": {
                        "type": "integer"
                      },
                      "bytesTotal": {
                        "type": "number"
                      },
                      "bytesDone": {
                        "type": "number"
                      },
                      "error": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "createdAt": {
                        "type": "string",
                        "format": "date-time",
                        "description": "ISO 8601 timestamp"
                      },
                      "startedAt": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "date-time",
                        "description": "ISO 8601 timestamp"
                      },
                      "finishedAt": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "date-time",
                        "description": "ISO 8601 timestamp"
                      }
                    },
                    "required": [
                      "id",
                      "kind",
                      "status",
                      "destination",
                      "overwrite",
                      "items",
                      "filesTotal",
                      "filesDone",
                      "bytesTotal",
                      "bytesDone",
                      "error",
                      "createdAt",
                      "startedAt",
                      "finishedAt"
                    ],
                    "additionalProperties": true
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/files/operations/{jobId}/cancel": {
      "post": {
        "operationId": "files.cancelOperation",
        "summary": "Cancel a queued or running move/copy job",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "cancelOperation",
        "x-boita-scopes": [
          "files:write"
        ],
        "security": [
          {
            "apiKey": [
              "files:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "kind": {
                      "type": "string",
                      "enum": [
                        "move",
                        "copy"
                      ]
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "queued",
                        "running",
                        "completed",
                        "failed",
                        "cancelled"
                      ]
                    },
                    "destination": {
                      "type": "string"
                    },
                    "overwrite": {
                      "type": "boolean"
                    },
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "path": {
                            "type": "string"
                          },
                          "type": {
                            "type": "string",
                            "enum": [
                              "file",
                              "folder"
                            ]
                          },
                          "bytes": {
                            "type": "number"
                          }
                        },
                        "required": [
                          "path",
                          "type",
                          "bytes"
                        ]
                      }
                    },
                    "filesTotal": {
                      "type": "integer"
                    },
                    "filesDone": {
                      "type": "integer"
                    },
                    "bytesTotal": {
                      "type": "number"
                    },
                    "bytesDone": {
                      "type": "number"
                    },
                    "error": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "createdAt": {
                      "type": "string",
                      "format": "date-time",
                      "description": "ISO 8601 timestamp"
                    },
                    "startedAt": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time",
                      "description": "ISO 8601 timestamp"
                    },
                    "finishedAt": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time",
                      "description": "ISO 8601 timestamp"
                    }
                  },
                  "required": [
                    "id",
                    "kind",
                    "status",
                    "destination",
                    "overwrite",
                    "items",
                    "filesTotal",
                    "filesDone",
                    "bytesTotal",
                    "bytesDone",
                    "error",
                    "createdAt",
                    "startedAt",
                    "finishedAt"
                  ],
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/files/rename-batch": {
      "post": {
        "operationId": "files.renameBatch",
        "summary": "Rename many items with a pattern (preview with dryRun)",
        "description": "Find/replace, prefix/suffix and numbering with padding. `dryRun: true` returns the plan and conflicts without touching anything; the apply runs exactly that plan.",
        "tags": [
          "Files"
        ],
        "x-boita-group": "files",
        "x-boita-method": "renameBatch",
        "x-boita-scopes": [
          "files:write"
        ],
        "security": [
          {
            "apiKey": [
              "files:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "paths": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 4096
                    },
                    "minItems": 1,
                    "maxItems": 200
                  },
                  "pattern": {
                    "type": "object",
                    "properties": {
                      "find": {
                        "type": "string",
                        "maxLength": 255
                      },
                      "replace": {
                        "type": "string",
                        "maxLength": 255
                      },
                      "regex": {
                        "type": "boolean"
                      },
                      "ignoreCase": {
                        "type": "boolean"
                      },
                      "includeExtension": {
                        "type": "boolean"
                      },
                      "prefix": {
                        "type": "string",
                        "maxLength": 120
                      },
                      "suffix": {
                        "type": "string",
                        "maxLength": 120
                      },
                      "numbering": {
                        "type": "object",
                        "properties": {
                          "start": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 999999,
                            "default": 1
                          },
                          "step": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 1000,
                            "default": 1
                          },
                          "padding": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 8,
                            "default": 3
                          },
                          "position": {
                            "type": "string",
                            "enum": [
                              "prefix",
                              "suffix",
                              "replace"
                            ],
                            "default": "suffix"
                          },
                          "separator": {
                            "type": "string",
                            "maxLength": 8,
                            "default": "_"
                          }
                        }
                      }
                    }
                  },
                  "dryRun": {
                    "type": "boolean",
                    "default": false
                  },
                  "overwrite": {
                    "type": "boolean",
                    "default": false
                  },
                  "expandSequences": {
                    "type": "boolean",
                    "default": true
                  }
                },
                "required": [
                  "paths",
                  "pattern"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "dryRun": {
                      "type": "boolean"
                    },
                    "expanded": {
                      "type": "integer"
                    },
                    "changed": {
                      "type": "integer"
                    },
                    "steps": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "from": {
                            "type": "string"
                          },
                          "to": {
                            "type": "string"
                          },
                          "name": {
                            "type": "string"
                          },
                          "newName": {
                            "type": "string"
                          },
                          "changed": {
                            "type": "boolean"
                          }
                        },
                        "required": [
                          "from",
                          "to",
                          "name",
                          "newName",
                          "changed"
                        ]
                      }
                    },
                    "conflicts": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "path": {
                            "type": "string"
                          },
                          "name": {
                            "type": "string"
                          },
                          "reason": {
                            "type": "string",
                            "enum": [
                              "duplicate_target",
                              "exists",
                              "invalid"
                            ]
                          }
                        },
                        "required": [
                          "path",
                          "name",
                          "reason"
                        ]
                      }
                    },
                    "applied": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "from": {
                            "type": "string"
                          },
                          "to": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "from",
                          "to"
                        ]
                      }
                    },
                    "failed": {
                      "type": [
                        "object",
                        "null"
                      ],
                      "properties": {
                        "from": {
                          "type": "string"
                        },
                        "to": {
                          "type": "string"
                        },
                        "error": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "from",
                        "to",
                        "error"
                      ]
                    }
                  },
                  "required": [
                    "dryRun",
                    "expanded",
                    "changed",
                    "steps",
                    "conflicts",
                    "applied",
                    "failed"
                  ],
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/transfers": {
      "post": {
        "operationId": "transfers.create",
        "summary": "Request a transfer spec",
        "description": "Returns a spec the transfer engine (Boita desktop, the CLI agent or a gateway) runs; the API never moves bytes itself.",
        "tags": [
          "Transfers"
        ],
        "x-boita-group": "transfers",
        "x-boita-method": "create",
        "x-boita-scopes": [
          "files:write"
        ],
        "security": [
          {
            "apiKey": [
              "files:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "direction": {
                    "type": "string",
                    "enum": [
                      "send",
                      "receive"
                    ]
                  },
                  "paths": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "source": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 4096
                        },
                        "destination": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 4096
                        }
                      },
                      "required": [
                        "source"
                      ]
                    },
                    "minItems": 1,
                    "maxItems": 10000
                  },
                  "destinationRoot": {
                    "anyOf": [
                      {
                        "const": "",
                        "type": "string"
                      },
                      {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 4096
                      }
                    ]
                  },
                  "sourceRoot": {
                    "anyOf": [
                      {
                        "const": "",
                        "type": "string"
                      },
                      {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 4096
                      }
                    ]
                  },
                  "fileCount": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "totalBytes": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "streams": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 128
                  },
                  "growingFileWaitSeconds": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 3600
                  },
                  "contentProtectionPassword": {
                    "type": "string",
                    "minLength": 8,
                    "maxLength": 256
                  },
                  "priority": {
                    "type": "string",
                    "enum": [
                      "normal",
                      "deadline",
                      "background"
                    ]
                  },
                  "deliverTo": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64
                    },
                    "maxItems": 20
                  },
                  "rawAscp": {
                    "type": "boolean"
                  },
                  "speedMode": {
                    "type": "boolean"
                  },
                  "client": {
                    "type": "string",
                    "enum": [
                      "web",
                      "desktop",
                      "mobile",
                      "gateway",
                      "share",
                      "portal",
                      "agent"
                    ],
                    "default": "agent"
                  },
                  "deviceId": {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9_-]{16,64}$"
                  },
                  "shareId": {
                    "type": "string"
                  },
                  "portalId": {
                    "type": "string"
                  }
                },
                "required": [
                  "direction",
                  "paths"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransferCreated"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      },
      "get": {
        "operationId": "transfers.list",
        "summary": "List recent transfers",
        "tags": [
          "Transfers"
        ],
        "x-boita-group": "transfers",
        "x-boita-method": "list",
        "x-boita-scopes": [
          "files:read"
        ],
        "security": [
          {
            "apiKey": [
              "files:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Transfer"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/transfers/{transferId}": {
      "get": {
        "operationId": "transfers.get",
        "summary": "Get one transfer",
        "tags": [
          "Transfers"
        ],
        "x-boita-group": "transfers",
        "x-boita-method": "get",
        "x-boita-scopes": [
          "files:read"
        ],
        "security": [
          {
            "apiKey": [
              "files:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "transferId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Transfer"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      },
      "patch": {
        "operationId": "transfers.reportProgress",
        "summary": "Report client-side progress",
        "tags": [
          "Transfers"
        ],
        "x-boita-group": "transfers",
        "x-boita-method": "reportProgress",
        "x-boita-scopes": [
          "files:write"
        ],
        "security": [
          {
            "apiKey": [
              "files:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "transferId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "status": {
                    "type": "string",
                    "enum": [
                      "queued",
                      "running",
                      "paused",
                      "completed",
                      "failed",
                      "cancelled"
                    ]
                  },
                  "bytesDone": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "bytesTotal": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "filesDone": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "filesTotal": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "rateKbps": {
                    "type": "number",
                    "minimum": 0
                  },
                  "errorCode": {
                    "type": "string"
                  },
                  "errorMessage": {
                    "type": "string",
                    "maxLength": 500
                  }
                },
                "required": [
                  "status",
                  "bytesDone",
                  "filesDone"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Transfer"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/shares": {
      "post": {
        "operationId": "shares.create",
        "summary": "Create a share link",
        "tags": [
          "Shares"
        ],
        "x-boita-group": "shares",
        "x-boita-method": "create",
        "x-boita-scopes": [
          "shares:write"
        ],
        "security": [
          {
            "apiKey": [
              "shares:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "mode": {
                    "type": "string",
                    "enum": [
                      "drive",
                      "send"
                    ],
                    "default": "drive"
                  },
                  "paths": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 4096
                    },
                    "minItems": 1,
                    "maxItems": 500
                  },
                  "title": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "message": {
                    "type": "string",
                    "maxLength": 4000
                  },
                  "expiresInDays": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 3650
                  },
                  "maxDownloads": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 100000
                  },
                  "password": {
                    "type": "string",
                    "minLength": 8,
                    "maxLength": 256
                  },
                  "notifyOnDownload": {
                    "type": "boolean"
                  },
                  "allowPreview": {
                    "type": "boolean"
                  },
                  "allowComments": {
                    "type": "boolean"
                  },
                  "requireEmail": {
                    "type": "boolean"
                  },
                  "recipients": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "email"
                    },
                    "maxItems": 200
                  },
                  "phones": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 8,
                      "maxLength": 20
                    },
                    "maxItems": 200
                  },
                  "availableFrom": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "viewOnly": {
                    "type": "boolean"
                  },
                  "watermark": {
                    "type": "boolean"
                  },
                  "templateId": {
                    "type": "string",
                    "maxLength": 64
                  },
                  "recipientGroups": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "maxLength": 64
                    },
                    "maxItems": 20
                  },
                  "reviewRoles": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string",
                      "enum": [
                        "viewer",
                        "reviewer",
                        "approver"
                      ]
                    }
                  },
                  "projectId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 64
                  },
                  "locale": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "enum": [
                      "en"
                    ]
                  }
                },
                "required": [
                  "paths"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Share"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      },
      "get": {
        "operationId": "shares.list",
        "summary": "List share links",
        "tags": [
          "Shares"
        ],
        "x-boita-group": "shares",
        "x-boita-method": "list",
        "x-boita-scopes": [
          "shares:write",
          "receipts:read"
        ],
        "security": [
          {
            "apiKey": [
              "shares:write",
              "receipts:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Share"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/shares/{shareId}": {
      "get": {
        "operationId": "shares.get",
        "summary": "Get a share link with its activity",
        "tags": [
          "Shares"
        ],
        "x-boita-group": "shares",
        "x-boita-method": "get",
        "x-boita-scopes": [
          "shares:write",
          "receipts:read"
        ],
        "security": [
          {
            "apiKey": [
              "shares:write",
              "receipts:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "shareId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ShareDetail"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      },
      "patch": {
        "operationId": "shares.extend",
        "summary": "Extend a share link",
        "tags": [
          "Shares"
        ],
        "x-boita-group": "shares",
        "x-boita-method": "extend",
        "x-boita-scopes": [
          "shares:write"
        ],
        "security": [
          {
            "apiKey": [
              "shares:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "shareId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "expiresInDays": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 3650
                  },
                  "projectId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 64
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Share"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      },
      "delete": {
        "operationId": "shares.revoke",
        "summary": "Revoke a share link",
        "tags": [
          "Shares"
        ],
        "x-boita-group": "shares",
        "x-boita-method": "revoke",
        "x-boita-scopes": [
          "shares:write"
        ],
        "security": [
          {
            "apiKey": [
              "shares:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "shareId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/shares/bulk": {
      "post": {
        "operationId": "shares.bulk",
        "summary": "Extend, revoke or re-notify many links",
        "tags": [
          "Shares"
        ],
        "x-boita-group": "shares",
        "x-boita-method": "bulk",
        "x-boita-scopes": [
          "shares:write"
        ],
        "security": [
          {
            "apiKey": [
              "shares:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64
                    },
                    "minItems": 1,
                    "maxItems": 200
                  },
                  "action": {
                    "type": "string",
                    "enum": [
                      "extend",
                      "revoke",
                      "renotify"
                    ]
                  },
                  "days": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 3650
                  }
                },
                "required": [
                  "ids",
                  "action"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/shares/{shareId}/recipients": {
      "post": {
        "operationId": "shares.addRecipients",
        "summary": "Add recipients (email or WhatsApp number) to a live link",
        "tags": [
          "Shares"
        ],
        "x-boita-group": "shares",
        "x-boita-method": "addRecipients",
        "x-boita-scopes": [
          "shares:write"
        ],
        "security": [
          {
            "apiKey": [
              "shares:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "shareId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "emails": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "email"
                    },
                    "maxItems": 200
                  },
                  "phones": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 8,
                      "maxLength": 20
                    },
                    "maxItems": 200
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ShareDetail"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/shares/{shareId}/comments": {
      "get": {
        "operationId": "shares.listComments",
        "summary": "List recipient comments",
        "tags": [
          "Shares"
        ],
        "x-boita-group": "shares",
        "x-boita-method": "listComments",
        "x-boita-scopes": [
          "receipts:read"
        ],
        "security": [
          {
            "apiKey": [
              "receipts:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "shareId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Comment"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      },
      "post": {
        "operationId": "shares.reply",
        "summary": "Reply to recipients",
        "tags": [
          "Shares"
        ],
        "x-boita-group": "shares",
        "x-boita-method": "reply",
        "x-boita-scopes": [
          "shares:write"
        ],
        "security": [
          {
            "apiKey": [
              "shares:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "shareId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "itemPath": {
                    "type": "string",
                    "maxLength": 4096
                  },
                  "body": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000
                  },
                  "parentId": {
                    "type": "string",
                    "maxLength": 64
                  },
                  "timecode": {
                    "type": "string",
                    "maxLength": 20
                  },
                  "timecodeMs": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 2592000000
                  },
                  "annotation": {
                    "type": "object",
                    "properties": {
                      "v": {
                        "const": 1,
                        "type": "number"
                      },
                      "aspect": {
                        "type": "number",
                        "minimum": 0.1,
                        "maximum": 10
                      },
                      "page": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 50
                      },
                      "strokes": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "tool": {
                              "type": "string",
                              "enum": [
                                "pen",
                                "arrow",
                                "rect"
                              ]
                            },
                            "color": {
                              "type": "string",
                              "pattern": "^#[0-9a-fA-F]{6}$"
                            },
                            "width": {
                              "type": "number",
                              "minimum": 0.001,
                              "maximum": 0.05
                            },
                            "points": {
                              "type": "array",
                              "items": {
                                "type": "array",
                                "prefixItems": [
                                  {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 1
                                  },
                                  {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 1
                                  }
                                ],
                                "items": false
                              },
                              "minItems": 2,
                              "maxItems": 2000
                            }
                          },
                          "required": [
                            "tool",
                            "color",
                            "width",
                            "points"
                          ]
                        },
                        "minItems": 1,
                        "maxItems": 200
                      }
                    },
                    "required": [
                      "v",
                      "strokes"
                    ]
                  }
                },
                "required": [
                  "body"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Comment"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/shares/{shareId}/receipt": {
      "get": {
        "operationId": "receipts.get",
        "summary": "Delivery receipt",
        "description": "Who viewed, who downloaded, per-file checksums and whether every download verified.",
        "tags": [
          "Receipts"
        ],
        "x-boita-group": "receipts",
        "x-boita-method": "get",
        "x-boita-scopes": [
          "receipts:read"
        ],
        "security": [
          {
            "apiKey": [
              "receipts:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "shareId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Receipt"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/shares/{shareId}/receipt.pdf": {
      "get": {
        "operationId": "receipts.pdf",
        "summary": "Delivery receipt as PDF",
        "tags": [
          "Receipts"
        ],
        "x-boita-group": "receipts",
        "x-boita-method": "pdf",
        "x-boita-scopes": [
          "receipts:read"
        ],
        "security": [
          {
            "apiKey": [
              "receipts:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "shareId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/shares/{shareId}/receipt.csv": {
      "get": {
        "operationId": "receipts.verificationCsv",
        "summary": "Verification report as CSV",
        "tags": [
          "Receipts"
        ],
        "x-boita-group": "receipts",
        "x-boita-method": "verificationCsv",
        "x-boita-scopes": [
          "receipts:read"
        ],
        "security": [
          {
            "apiKey": [
              "receipts:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "shareId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/shares/{shareId}/delivery-note.pdf": {
      "get": {
        "operationId": "receipts.deliveryNotePdf",
        "summary": "Printable delivery note",
        "tags": [
          "Receipts"
        ],
        "x-boita-group": "receipts",
        "x-boita-method": "deliveryNotePdf",
        "x-boita-scopes": [
          "receipts:read"
        ],
        "security": [
          {
            "apiKey": [
              "receipts:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "shareId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/portals": {
      "post": {
        "operationId": "portals.create",
        "summary": "Create an upload portal",
        "tags": [
          "Portals"
        ],
        "x-boita-group": "portals",
        "x-boita-method": "create",
        "x-boita-scopes": [
          "portals:write"
        ],
        "security": [
          {
            "apiKey": [
              "portals:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "fields": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "key": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 40,
                          "pattern": "^[a-z0-9_]+$"
                        },
                        "label": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 80
                        },
                        "required": {
                          "type": "boolean",
                          "default": false
                        },
                        "type": {
                          "type": "string",
                          "enum": [
                            "text",
                            "select"
                          ],
                          "default": "text"
                        },
                        "options": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 80
                          },
                          "maxItems": 50
                        },
                        "hint": {
                          "type": "string",
                          "maxLength": 200
                        }
                      },
                      "required": [
                        "key",
                        "label"
                      ]
                    },
                    "maxItems": 20
                  },
                  "rules": {
                    "type": "object",
                    "properties": {
                      "allowedExtensions": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 12,
                          "pattern": "^[a-z0-9]+$"
                        },
                        "maxItems": 50
                      },
                      "maxFiles": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 5000
                      },
                      "namePattern": {
                        "type": "string",
                        "maxLength": 200
                      },
                      "namePatternHint": {
                        "type": "string",
                        "maxLength": 200
                      },
                      "minBytes": {
                        "type": "integer",
                        "minimum": 0
                      }
                    }
                  },
                  "spec": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string",
                        "maxLength": 80
                      },
                      "containers": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 20
                        },
                        "maxItems": 20
                      },
                      "videoCodecs": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 30
                        },
                        "maxItems": 20
                      },
                      "audioCodecs": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 30
                        },
                        "maxItems": 20
                      },
                      "minWidth": {
                        "type": "integer",
                        "exclusiveMinimum": 0
                      },
                      "minHeight": {
                        "type": "integer",
                        "exclusiveMinimum": 0
                      },
                      "fps": {
                        "type": "array",
                        "items": {
                          "type": "number",
                          "exclusiveMinimum": 0
                        },
                        "maxItems": 10
                      },
                      "audioChannels": {
                        "type": "array",
                        "items": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "maxItems": 5
                      },
                      "minDurationSeconds": {
                        "type": "number",
                        "minimum": 0
                      },
                      "maxDurationSeconds": {
                        "type": "number",
                        "exclusiveMinimum": 0
                      }
                    }
                  },
                  "dueAt": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "inviteEmails": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "email"
                    },
                    "maxItems": 100
                  },
                  "invitePhones": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 8,
                      "maxLength": 20
                    },
                    "maxItems": 100
                  },
                  "title": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120
                  },
                  "message": {
                    "type": "string",
                    "maxLength": 2000
                  },
                  "targetPath": {
                    "type": "string",
                    "maxLength": 4096,
                    "default": ""
                  },
                  "requireEmail": {
                    "type": "boolean"
                  },
                  "password": {
                    "type": "string",
                    "minLength": 8,
                    "maxLength": 256
                  },
                  "maxBytesPerUpload": {
                    "type": "integer",
                    "exclusiveMinimum": 0
                  },
                  "expiresInDays": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 3650
                  },
                  "notifyOnUpload": {
                    "type": "boolean"
                  },
                  "projectId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 64
                  }
                },
                "required": [
                  "title"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Portal"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      },
      "get": {
        "operationId": "portals.list",
        "summary": "List upload portals",
        "tags": [
          "Portals"
        ],
        "x-boita-group": "portals",
        "x-boita-method": "list",
        "x-boita-scopes": [
          "portals:write",
          "receipts:read"
        ],
        "security": [
          {
            "apiKey": [
              "portals:write",
              "receipts:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Portal"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/portals/{portalId}": {
      "get": {
        "operationId": "portals.get",
        "summary": "Get a portal with its uploads",
        "tags": [
          "Portals"
        ],
        "x-boita-group": "portals",
        "x-boita-method": "get",
        "x-boita-scopes": [
          "portals:write",
          "receipts:read"
        ],
        "security": [
          {
            "apiKey": [
              "portals:write",
              "receipts:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "portalId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PortalDetail"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      },
      "patch": {
        "operationId": "portals.update",
        "summary": "Update or pause a portal",
        "tags": [
          "Portals"
        ],
        "x-boita-group": "portals",
        "x-boita-method": "update",
        "x-boita-scopes": [
          "portals:write"
        ],
        "security": [
          {
            "apiKey": [
              "portals:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "portalId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "projectId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 64
                  },
                  "title": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120
                  },
                  "message": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 2000
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "active",
                      "paused"
                    ]
                  },
                  "requireEmail": {
                    "type": "boolean"
                  },
                  "password": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "minLength": 8,
                    "maxLength": 256
                  },
                  "maxBytesPerUpload": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "exclusiveMinimum": 0
                  },
                  "expiresInDays": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "minimum": 1,
                    "maximum": 3650
                  },
                  "notifyOnUpload": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Portal"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      },
      "delete": {
        "operationId": "portals.revoke",
        "summary": "Revoke a portal",
        "tags": [
          "Portals"
        ],
        "x-boita-group": "portals",
        "x-boita-method": "revoke",
        "x-boita-scopes": [
          "portals:write"
        ],
        "security": [
          {
            "apiKey": [
              "portals:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "portalId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/portals/{portalId}/uploads/{uploadId}/review": {
      "post": {
        "operationId": "portals.reviewUpload",
        "summary": "Approve or reject an upload",
        "tags": [
          "Portals"
        ],
        "x-boita-group": "portals",
        "x-boita-method": "reviewUpload",
        "x-boita-scopes": [
          "portals:write"
        ],
        "security": [
          {
            "apiKey": [
              "portals:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "portalId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "uploadId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "decision": {
                    "type": "string",
                    "enum": [
                      "approved",
                      "rejected",
                      "pending"
                    ]
                  },
                  "note": {
                    "type": "string",
                    "maxLength": 500
                  }
                },
                "required": [
                  "decision"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PortalUpload"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/webhooks/events": {
      "get": {
        "operationId": "webhooks.eventTypes",
        "summary": "Event types an endpoint can subscribe to",
        "tags": [
          "Webhooks"
        ],
        "x-boita-group": "webhooks",
        "x-boita-method": "eventTypes",
        "x-boita-scopes": [
          "webhooks:manage"
        ],
        "security": [
          {
            "apiKey": [
              "webhooks:manage"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventCatalogue"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/webhooks": {
      "post": {
        "operationId": "webhooks.create",
        "summary": "Create a webhook endpoint",
        "tags": [
          "Webhooks"
        ],
        "x-boita-group": "webhooks",
        "x-boita-method": "create",
        "x-boita-scopes": [
          "webhooks:manage"
        ],
        "security": [
          {
            "apiKey": [
              "webhooks:manage"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "minLength": 8,
                    "maxLength": 2048
                  },
                  "events": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64
                    },
                    "minItems": 1,
                    "maxItems": 50
                  },
                  "description": {
                    "type": "string",
                    "maxLength": 200
                  }
                },
                "required": [
                  "url",
                  "events"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookCreated"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      },
      "get": {
        "operationId": "webhooks.list",
        "summary": "List webhook endpoints",
        "tags": [
          "Webhooks"
        ],
        "x-boita-group": "webhooks",
        "x-boita-method": "list",
        "x-boita-scopes": [
          "webhooks:manage"
        ],
        "security": [
          {
            "apiKey": [
              "webhooks:manage"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Webhook"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/webhooks/{webhookId}": {
      "patch": {
        "operationId": "webhooks.update",
        "summary": "Update, disable or re-enable an endpoint",
        "tags": [
          "Webhooks"
        ],
        "x-boita-group": "webhooks",
        "x-boita-method": "update",
        "x-boita-scopes": [
          "webhooks:manage"
        ],
        "security": [
          {
            "apiKey": [
              "webhooks:manage"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "webhookId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "minLength": 8,
                    "maxLength": 2048
                  },
                  "events": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64
                    },
                    "minItems": 1,
                    "maxItems": 50
                  },
                  "description": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 200
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "active",
                      "disabled"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Webhook"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      },
      "delete": {
        "operationId": "webhooks.delete",
        "summary": "Delete an endpoint",
        "tags": [
          "Webhooks"
        ],
        "x-boita-group": "webhooks",
        "x-boita-method": "delete",
        "x-boita-scopes": [
          "webhooks:manage"
        ],
        "security": [
          {
            "apiKey": [
              "webhooks:manage"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "webhookId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/webhooks/{webhookId}/rotate-secret": {
      "post": {
        "operationId": "webhooks.rotateSecret",
        "summary": "Rotate the signing secret",
        "tags": [
          "Webhooks"
        ],
        "x-boita-group": "webhooks",
        "x-boita-method": "rotateSecret",
        "x-boita-scopes": [
          "webhooks:manage"
        ],
        "security": [
          {
            "apiKey": [
              "webhooks:manage"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "webhookId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookSecret"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/webhooks/{webhookId}/test": {
      "post": {
        "operationId": "webhooks.sendTest",
        "summary": "Send a webhook.test event to this endpoint",
        "tags": [
          "Webhooks"
        ],
        "x-boita-group": "webhooks",
        "x-boita-method": "sendTest",
        "x-boita-scopes": [
          "webhooks:manage"
        ],
        "security": [
          {
            "apiKey": [
              "webhooks:manage"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "webhookId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestQueued"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/webhooks/{webhookId}/deliveries": {
      "get": {
        "operationId": "webhooks.listDeliveries",
        "summary": "Recent deliveries to an endpoint",
        "tags": [
          "Webhooks"
        ],
        "x-boita-group": "webhooks",
        "x-boita-method": "listDeliveries",
        "x-boita-scopes": [
          "webhooks:manage"
        ],
        "security": [
          {
            "apiKey": [
              "webhooks:manage"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "webhookId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/WebhookDelivery"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/webhooks/{webhookId}/deliveries/{deliveryId}/retry": {
      "post": {
        "operationId": "webhooks.retryDelivery",
        "summary": "Retry a delivery now",
        "tags": [
          "Webhooks"
        ],
        "x-boita-group": "webhooks",
        "x-boita-method": "retryDelivery",
        "x-boita-scopes": [
          "webhooks:manage"
        ],
        "security": [
          {
            "apiKey": [
              "webhooks:manage"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "webhookId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "deliveryId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeliveryQueued"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/hooks/subscribe": {
      "post": {
        "operationId": "hooks.subscribe",
        "summary": "Subscribe a REST hook",
        "description": "Zapier-style REST hook: creates a webhook endpoint for the event(s) and returns its id. Same limits as webhook endpoints (10 per workspace).",
        "tags": [
          "Webhooks"
        ],
        "x-boita-group": "hooks",
        "x-boita-method": "subscribe",
        "x-boita-scopes": [
          "webhooks:manage"
        ],
        "security": [
          {
            "apiKey": [
              "webhooks:manage"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "target_url": {
                    "type": "string",
                    "minLength": 8,
                    "maxLength": 2048,
                    "description": "Where to POST events (https)"
                  },
                  "event": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 64,
                    "description": "One event type (alternative to `events`)"
                  },
                  "events": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64
                    },
                    "minItems": 1,
                    "maxItems": 50,
                    "description": "Event types, or [\"*\"]"
                  },
                  "source": {
                    "type": "string",
                    "enum": [
                      "zapier",
                      "make",
                      "n8n",
                      "other"
                    ],
                    "description": "Shown next to the endpoint on the Developers page"
                  }
                },
                "required": [
                  "target_url"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string"
                    },
                    "events": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "secret": {
                      "type": "string",
                      "description": "Signing secret, shown once"
                    },
                    "source": {
                      "type": "string"
                    },
                    "unsubscribeUrl": {
                      "type": "string",
                      "description": "Relative; DELETE it to unsubscribe"
                    }
                  },
                  "required": [
                    "id",
                    "url",
                    "events",
                    "secret",
                    "source",
                    "unsubscribeUrl"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/hooks/unsubscribe/{hookId}": {
      "delete": {
        "operationId": "hooks.unsubscribe",
        "summary": "Unsubscribe a REST hook",
        "tags": [
          "Webhooks"
        ],
        "x-boita-group": "hooks",
        "x-boita-method": "unsubscribe",
        "x-boita-scopes": [
          "webhooks:manage"
        ],
        "security": [
          {
            "apiKey": [
              "webhooks:manage"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "hookId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/hooks/sample": {
      "get": {
        "operationId": "hooks.sample",
        "summary": "A sample delivery for an event type",
        "description": "The exact envelope the worker POSTs, with realistic data, so a trigger can be built before the first event.",
        "tags": [
          "Webhooks"
        ],
        "x-boita-group": "hooks",
        "x-boita-method": "sample",
        "x-boita-scopes": [
          "webhooks:manage"
        ],
        "security": [
          {
            "apiKey": [
              "webhooks:manage"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "event",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "type": {
                      "type": "string"
                    },
                    "createdAt": {
                      "type": "string",
                      "format": "date-time",
                      "description": "ISO 8601 timestamp"
                    },
                    "workspaceId": {
                      "type": "string"
                    },
                    "data": {
                      "type": "object",
                      "additionalProperties": {}
                    },
                    "delivery": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "attempt": {
                          "type": "integer"
                        }
                      },
                      "required": [
                        "id",
                        "attempt"
                      ]
                    }
                  },
                  "required": [
                    "id",
                    "type",
                    "createdAt",
                    "workspaceId",
                    "data",
                    "delivery"
                  ],
                  "description": "One delivery as the worker POSTs it"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/events": {
      "get": {
        "operationId": "events.list",
        "summary": "Poll the workspace event stream",
        "description": "Pass `after` = the last id you saw to page forward; the same events webhooks deliver.",
        "tags": [
          "Events"
        ],
        "x-boita-group": "events",
        "x-boita-method": "list",
        "x-boita-scopes": [
          "webhooks:manage"
        ],
        "security": [
          {
            "apiKey": [
              "webhooks:manage"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "after",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 64
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 64
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/WorkspaceEvent"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/usage": {
      "get": {
        "operationId": "usage.summary",
        "summary": "Storage usage and quota state",
        "tags": [
          "Usage"
        ],
        "x-boita-group": "usage",
        "x-boita-method": "summary",
        "x-boita-scopes": [
          "usage:read"
        ],
        "security": [
          {
            "apiKey": [
              "usage:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UsageSummary"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/usage/bandwidth": {
      "get": {
        "operationId": "usage.bandwidth",
        "summary": "Bandwidth over the last 30 or 90 days",
        "tags": [
          "Usage"
        ],
        "x-boita-group": "usage",
        "x-boita-method": "bandwidth",
        "x-boita-scopes": [
          "usage:read"
        ],
        "security": [
          {
            "apiKey": [
              "usage:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "30",
                "90"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bandwidth"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/cloud/deliveries": {
      "post": {
        "operationId": "cloud.deliver",
        "summary": "Deliver files to a connected cloud folder",
        "description": "Queues a server-side copy of a share's files (or explicit workspace paths) into a folder of a cloud account connected with delivery access. `destinationPath` is the provider-native folder locator from the web picker (\"\" = root).",
        "tags": [
          "Cloud"
        ],
        "x-boita-group": "cloud",
        "x-boita-method": "deliver",
        "x-boita-scopes": [
          "files:write"
        ],
        "security": [
          {
            "apiKey": [
              "files:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "accountId": {
                    "type": "string",
                    "maxLength": 64
                  },
                  "shareId": {
                    "type": "string",
                    "maxLength": 64
                  },
                  "sourcePaths": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 4096
                    },
                    "maxItems": 500
                  },
                  "destinationPath": {
                    "type": "string",
                    "maxLength": 2048,
                    "default": ""
                  },
                  "destinationLabel": {
                    "type": "string",
                    "maxLength": 300,
                    "default": ""
                  },
                  "overwrite": {
                    "type": "boolean",
                    "default": false
                  }
                },
                "required": [
                  "accountId"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "account": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "provider": {
                          "type": "string"
                        },
                        "label": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "id",
                        "provider",
                        "label"
                      ]
                    },
                    "shareId": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "sourcePaths": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "destinationPath": {
                      "type": "string"
                    },
                    "destinationLabel": {
                      "type": "string"
                    },
                    "overwrite": {
                      "type": "boolean"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "queued",
                        "running",
                        "completed",
                        "failed",
                        "cancelled"
                      ]
                    },
                    "filesTotal": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "bytesTotal": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "filesDone": {
                      "type": "integer"
                    },
                    "bytesDone": {
                      "type": "number"
                    },
                    "skipped": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "type": "object",
                        "properties": {
                          "path": {
                            "type": "string"
                          },
                          "reason": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "path",
                          "reason"
                        ]
                      }
                    },
                    "error": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "startedAt": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time"
                    },
                    "finishedAt": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time"
                    },
                    "createdAt": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "createdBy": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "account",
                    "shareId",
                    "sourcePaths",
                    "destinationPath",
                    "destinationLabel",
                    "overwrite",
                    "status",
                    "filesTotal",
                    "bytesTotal",
                    "filesDone",
                    "bytesDone",
                    "skipped",
                    "error",
                    "startedAt",
                    "finishedAt",
                    "createdAt",
                    "createdBy"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      },
      "get": {
        "operationId": "cloud.listDeliveries",
        "summary": "List cloud deliveries",
        "tags": [
          "Cloud"
        ],
        "x-boita-group": "cloud",
        "x-boita-method": "listDeliveries",
        "x-boita-scopes": [
          "files:read"
        ],
        "security": [
          {
            "apiKey": [
              "files:read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "shareId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string"
                      },
                      "account": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "provider": {
                            "type": "string"
                          },
                          "label": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "id",
                          "provider",
                          "label"
                        ]
                      },
                      "shareId": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "sourcePaths": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "destinationPath": {
                        "type": "string"
                      },
                      "destinationLabel": {
                        "type": "string"
                      },
                      "overwrite": {
                        "type": "boolean"
                      },
                      "status": {
                        "type": "string",
                        "enum": [
                          "queued",
                          "running",
                          "completed",
                          "failed",
                          "cancelled"
                        ]
                      },
                      "filesTotal": {
                        "type": [
                          "integer",
                          "null"
                        ]
                      },
                      "bytesTotal": {
                        "type": [
                          "number",
                          "null"
                        ]
                      },
                      "filesDone": {
                        "type": "integer"
                      },
                      "bytesDone": {
                        "type": "number"
                      },
                      "skipped": {
                        "type": [
                          "array",
                          "null"
                        ],
                        "items": {
                          "type": "object",
                          "properties": {
                            "path": {
                              "type": "string"
                            },
                            "reason": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "path",
                            "reason"
                          ]
                        }
                      },
                      "error": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "startedAt": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "date-time"
                      },
                      "finishedAt": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "date-time"
                      },
                      "createdAt": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "createdBy": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "id",
                      "account",
                      "shareId",
                      "sourcePaths",
                      "destinationPath",
                      "destinationLabel",
                      "overwrite",
                      "status",
                      "filesTotal",
                      "bytesTotal",
                      "filesDone",
                      "bytesDone",
                      "skipped",
                      "error",
                      "startedAt",
                      "finishedAt",
                      "createdAt",
                      "createdBy"
                    ]
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    },
    "/workspaces/{workspaceId}/cloud/deliveries/{deliveryId}/cancel": {
      "post": {
        "operationId": "cloud.cancelDelivery",
        "summary": "Cancel a cloud delivery",
        "tags": [
          "Cloud"
        ],
        "x-boita-group": "cloud",
        "x-boita-method": "cancelDelivery",
        "x-boita-scopes": [
          "files:write"
        ],
        "security": [
          {
            "apiKey": [
              "files:write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "workspaceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The workspace id (the key is bound to one workspace)"
          },
          {
            "name": "deliveryId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "account": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "provider": {
                          "type": "string"
                        },
                        "label": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "id",
                        "provider",
                        "label"
                      ]
                    },
                    "shareId": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "sourcePaths": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "destinationPath": {
                      "type": "string"
                    },
                    "destinationLabel": {
                      "type": "string"
                    },
                    "overwrite": {
                      "type": "boolean"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "queued",
                        "running",
                        "completed",
                        "failed",
                        "cancelled"
                      ]
                    },
                    "filesTotal": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "bytesTotal": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "filesDone": {
                      "type": "integer"
                    },
                    "bytesDone": {
                      "type": "number"
                    },
                    "skipped": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "type": "object",
                        "properties": {
                          "path": {
                            "type": "string"
                          },
                          "reason": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "path",
                          "reason"
                        ]
                      }
                    },
                    "error": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "startedAt": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time"
                    },
                    "finishedAt": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time"
                    },
                    "createdAt": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "createdBy": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "account",
                    "shareId",
                    "sourcePaths",
                    "destinationPath",
                    "destinationLabel",
                    "overwrite",
                    "status",
                    "filesTotal",
                    "bytesTotal",
                    "filesDone",
                    "bytesDone",
                    "skipped",
                    "error",
                    "startedAt",
                    "finishedAt",
                    "createdAt",
                    "createdBy"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "apiKey": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "boita_sk_…",
        "description": "Workspace API key. Scopes:\n- `files:read` — List and search files, folders, versions and trash; read transfers and watch folders\n- `files:write` — Create folders, rename, delete and restore; start transfers; manage watch folders\n- `shares:write` — Create, extend and revoke share links and read their details\n- `portals:write` — Create, update and revoke upload portals and review their uploads\n- `receipts:read` — Read delivery receipts, verification reports, comments and share details\n- `webhooks:manage` — Manage webhook endpoints and REST-hook subscriptions (Zapier, Make, n8n), read deliveries, retry and test them; poll the event stream\n- `usage:read` — Read storage, bandwidth, dashboard figures and the audit log"
      }
    },
    "schemas": {
      "FileEntry": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "path": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "file",
              "folder",
              "link"
            ]
          },
          "size": {
            "type": [
              "integer",
              "null"
            ]
          },
          "modifiedAt": {
            "type": [
              "string",
              "null"
            ]
          },
          "encrypted": {
            "type": "boolean"
          },
          "preview": {
            "type": "boolean"
          }
        },
        "required": [
          "name",
          "path",
          "type",
          "size",
          "modifiedAt",
          "encrypted"
        ],
        "additionalProperties": true
      },
      "FileListing": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          },
          "access": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FileEntry"
            }
          },
          "total": {
            "type": "integer"
          }
        },
        "required": [
          "path",
          "access",
          "items",
          "total"
        ],
        "additionalProperties": true
      },
      "SearchResult": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FileEntry"
            }
          }
        },
        "required": [
          "items"
        ],
        "additionalProperties": true
      },
      "TrashItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "path": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "sizeBytes": {
            "type": [
              "number",
              "null"
            ]
          },
          "deletedAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "purgeAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          }
        },
        "required": [
          "id",
          "path",
          "name",
          "sizeBytes",
          "deletedAt",
          "purgeAt"
        ],
        "additionalProperties": true
      },
      "FileVersion": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "path": {
            "type": "string"
          },
          "sizeBytes": {
            "type": [
              "number",
              "null"
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          }
        },
        "required": [
          "id",
          "path",
          "sizeBytes",
          "createdAt"
        ],
        "additionalProperties": true
      },
      "Ok": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean"
          }
        },
        "required": [
          "ok"
        ],
        "additionalProperties": true
      },
      "Transfer": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "direction": {
            "type": "string",
            "enum": [
              "send",
              "receive"
            ]
          },
          "client": {
            "type": "string"
          },
          "engine": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "running",
              "paused",
              "completed",
              "failed",
              "cancelled"
            ]
          },
          "streams": {
            "type": "integer"
          },
          "priority": {
            "type": "string"
          },
          "usageId": {
            "type": "string"
          },
          "filesTotal": {
            "type": [
              "integer",
              "null"
            ]
          },
          "filesDone": {
            "type": "integer"
          },
          "bytesTotal": {
            "type": [
              "number",
              "null"
            ]
          },
          "bytesDone": {
            "type": "number"
          },
          "avgRateKbps": {
            "type": [
              "number",
              "null"
            ]
          },
          "startedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "finishedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "errorCode": {
            "type": [
              "string",
              "null"
            ]
          },
          "errorMessage": {
            "type": [
              "string",
              "null"
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          }
        },
        "required": [
          "id",
          "direction",
          "client",
          "engine",
          "status",
          "streams",
          "priority",
          "usageId",
          "filesTotal",
          "filesDone",
          "bytesTotal",
          "bytesDone",
          "avgRateKbps",
          "startedAt",
          "finishedAt",
          "errorCode",
          "errorMessage",
          "createdAt"
        ],
        "additionalProperties": true
      },
      "TransferCreated": {
        "type": "object",
        "properties": {
          "transferId": {
            "type": "string"
          },
          "transferSpec": {
            "type": "object",
            "additionalProperties": {},
            "description": "Hand this to the transfer engine unchanged; it is valid for a short window."
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          }
        },
        "required": [
          "transferId",
          "transferSpec",
          "expiresAt"
        ],
        "additionalProperties": true
      },
      "ShareItem": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "file",
              "folder"
            ]
          },
          "sizeBytes": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "path",
          "name",
          "type",
          "sizeBytes"
        ]
      },
      "ShareRecipient": {
        "type": "object",
        "properties": {
          "email": {
            "type": [
              "string",
              "null"
            ]
          },
          "phone": {
            "type": [
              "string",
              "null"
            ]
          },
          "label": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "firstViewedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "downloadedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "verifiedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          }
        },
        "required": [
          "email",
          "phone",
          "label",
          "url",
          "firstViewedAt",
          "downloadedAt",
          "verifiedAt"
        ],
        "additionalProperties": true
      },
      "Share": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "description": "Relative on the app host, absolute on a custom domain"
          },
          "mode": {
            "type": "string",
            "enum": [
              "drive",
              "send"
            ]
          },
          "title": {
            "type": [
              "string",
              "null"
            ]
          },
          "message": {
            "type": [
              "string",
              "null"
            ]
          },
          "hasPassword": {
            "type": "boolean"
          },
          "status": {
            "type": "string"
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "maxDownloads": {
            "type": [
              "integer",
              "null"
            ]
          },
          "downloadCount": {
            "type": "integer"
          },
          "viewCount": {
            "type": "integer"
          },
          "requireEmail": {
            "type": "boolean"
          },
          "allowComments": {
            "type": "boolean"
          },
          "viewOnly": {
            "type": "boolean"
          },
          "watermark": {
            "type": "boolean"
          },
          "availableFrom": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ShareItem"
            }
          },
          "recipients": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ShareRecipient"
            }
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          }
        },
        "required": [
          "id",
          "slug",
          "url",
          "mode",
          "title",
          "message",
          "hasPassword",
          "status",
          "expiresAt",
          "maxDownloads",
          "downloadCount",
          "viewCount",
          "requireEmail",
          "allowComments",
          "viewOnly",
          "watermark",
          "availableFrom",
          "items",
          "recipients",
          "createdAt"
        ],
        "additionalProperties": true
      },
      "ShareDetail": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "description": "Relative on the app host, absolute on a custom domain"
          },
          "mode": {
            "type": "string",
            "enum": [
              "drive",
              "send"
            ]
          },
          "title": {
            "type": [
              "string",
              "null"
            ]
          },
          "message": {
            "type": [
              "string",
              "null"
            ]
          },
          "hasPassword": {
            "type": "boolean"
          },
          "status": {
            "type": "string"
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "maxDownloads": {
            "type": [
              "integer",
              "null"
            ]
          },
          "downloadCount": {
            "type": "integer"
          },
          "viewCount": {
            "type": "integer"
          },
          "requireEmail": {
            "type": "boolean"
          },
          "allowComments": {
            "type": "boolean"
          },
          "viewOnly": {
            "type": "boolean"
          },
          "watermark": {
            "type": "boolean"
          },
          "availableFrom": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ShareItem"
            }
          },
          "recipients": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ShareRecipient"
            }
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "events": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "type": {
                  "type": "string"
                },
                "at": {
                  "type": "string",
                  "format": "date-time",
                  "description": "ISO 8601 timestamp"
                },
                "ip": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "userAgent": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "recipient": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "type",
                "at",
                "ip",
                "userAgent",
                "recipient"
              ],
              "additionalProperties": true
            }
          }
        },
        "required": [
          "id",
          "slug",
          "url",
          "mode",
          "title",
          "message",
          "hasPassword",
          "status",
          "expiresAt",
          "maxDownloads",
          "downloadCount",
          "viewCount",
          "requireEmail",
          "allowComments",
          "viewOnly",
          "watermark",
          "availableFrom",
          "items",
          "recipients",
          "createdAt",
          "events"
        ],
        "additionalProperties": true
      },
      "BulkResult": {
        "type": "object",
        "properties": {
          "done": {
            "type": "integer"
          },
          "failed": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "error": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "error"
              ]
            }
          }
        },
        "required": [
          "done"
        ],
        "additionalProperties": true
      },
      "Comment": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "body": {
            "type": "string"
          },
          "author": {
            "type": [
              "string",
              "null"
            ]
          },
          "itemPath": {
            "type": [
              "string",
              "null"
            ]
          },
          "resolvedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          }
        },
        "required": [
          "id",
          "body",
          "author",
          "itemPath",
          "resolvedAt",
          "createdAt"
        ],
        "additionalProperties": true
      },
      "Receipt": {
        "type": "object",
        "properties": {
          "receiptId": {
            "type": "string"
          },
          "share": {
            "type": "object",
            "properties": {
              "url": {
                "type": "string"
              },
              "title": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "status": {
                "type": "string"
              },
              "hasPassword": {
                "type": "boolean"
              },
              "maxDownloads": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "createdAt": {
                "type": "string",
                "format": "date-time",
                "description": "ISO 8601 timestamp"
              },
              "expiresAt": {
                "type": "string",
                "format": "date-time",
                "description": "ISO 8601 timestamp"
              },
              "viewCount": {
                "type": "integer"
              },
              "downloadCount": {
                "type": "integer"
              }
            },
            "required": [
              "url",
              "title",
              "status",
              "hasPassword",
              "maxDownloads",
              "createdAt",
              "expiresAt",
              "viewCount",
              "downloadCount"
            ],
            "additionalProperties": true
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ShareItem"
            }
          },
          "totalBytes": {
            "type": [
              "number",
              "null"
            ]
          },
          "recipients": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "email": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "phone": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "label": {
                  "type": "string"
                },
                "firstViewedAt": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time",
                  "description": "ISO 8601 timestamp"
                },
                "downloadedAt": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time",
                  "description": "ISO 8601 timestamp"
                },
                "verifiedAt": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time",
                  "description": "ISO 8601 timestamp"
                },
                "downloads": {
                  "type": "integer"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "sent",
                    "viewed",
                    "downloaded"
                  ]
                }
              },
              "required": [
                "email",
                "phone",
                "label",
                "firstViewedAt",
                "downloadedAt",
                "verifiedAt",
                "downloads",
                "status"
              ],
              "additionalProperties": true
            }
          },
          "anonymous": {
            "type": "object",
            "properties": {
              "views": {
                "type": "integer"
              },
              "downloads": {
                "type": "integer"
              }
            },
            "required": [
              "views",
              "downloads"
            ]
          },
          "downloads": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "transferId": {
                  "type": "string"
                },
                "recipient": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "client": {
                  "type": "string"
                },
                "files": {
                  "type": "integer"
                },
                "bytes": {
                  "type": "number"
                },
                "rateMbps": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "completedAt": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time",
                  "description": "ISO 8601 timestamp"
                },
                "seconds": {
                  "type": [
                    "number",
                    "null"
                  ]
                }
              },
              "required": [
                "transferId",
                "recipient",
                "client",
                "files",
                "bytes",
                "rateMbps",
                "completedAt",
                "seconds"
              ],
              "additionalProperties": true
            }
          },
          "timeline": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "type": {
                  "type": "string"
                },
                "at": {
                  "type": "string",
                  "format": "date-time",
                  "description": "ISO 8601 timestamp"
                },
                "recipient": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "client": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "type",
                "at",
                "recipient",
                "client"
              ],
              "additionalProperties": true
            }
          },
          "integrity": {
            "type": "string",
            "enum": [
              "verified",
              "none"
            ]
          },
          "files": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                },
                "sizeBytes": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "checksumType": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "checksum": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "downloads": {
                  "type": "integer"
                },
                "verifiedDownloads": {
                  "type": "integer"
                },
                "verified": {
                  "type": "boolean"
                }
              },
              "required": [
                "path",
                "sizeBytes",
                "checksumType",
                "checksum",
                "downloads",
                "verifiedDownloads",
                "verified"
              ]
            }
          },
          "checksumType": {
            "type": "string"
          }
        },
        "required": [
          "receiptId",
          "share",
          "items",
          "totalBytes",
          "recipients",
          "anonymous",
          "downloads",
          "timeline",
          "integrity",
          "files",
          "checksumType"
        ],
        "additionalProperties": true
      },
      "Portal": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "message": {
            "type": [
              "string",
              "null"
            ]
          },
          "targetPath": {
            "type": "string"
          },
          "requireEmail": {
            "type": "boolean"
          },
          "hasPassword": {
            "type": "boolean"
          },
          "maxBytesPerUpload": {
            "type": [
              "number",
              "null"
            ]
          },
          "expiresAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "notifyOnUpload": {
            "type": "boolean"
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "paused",
              "revoked"
            ]
          },
          "uploadCount": {
            "type": "integer"
          },
          "bytesReceived": {
            "type": "number"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          }
        },
        "required": [
          "id",
          "slug",
          "url",
          "title",
          "message",
          "targetPath",
          "requireEmail",
          "hasPassword",
          "maxBytesPerUpload",
          "expiresAt",
          "notifyOnUpload",
          "status",
          "uploadCount",
          "bytesReceived",
          "createdAt"
        ],
        "additionalProperties": true
      },
      "PortalUpload": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "senderEmail": {
            "type": [
              "string",
              "null"
            ]
          },
          "senderName": {
            "type": [
              "string",
              "null"
            ]
          },
          "message": {
            "type": [
              "string",
              "null"
            ]
          },
          "folderPath": {
            "type": "string"
          },
          "fileCount": {
            "type": [
              "integer",
              "null"
            ]
          },
          "bytesTotal": {
            "type": [
              "number",
              "null"
            ]
          },
          "bytesDone": {
            "type": "number"
          },
          "status": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "completedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          }
        },
        "required": [
          "id",
          "senderEmail",
          "senderName",
          "message",
          "folderPath",
          "fileCount",
          "bytesTotal",
          "bytesDone",
          "status",
          "createdAt",
          "completedAt"
        ],
        "additionalProperties": true
      },
      "PortalDetail": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "message": {
            "type": [
              "string",
              "null"
            ]
          },
          "targetPath": {
            "type": "string"
          },
          "requireEmail": {
            "type": "boolean"
          },
          "hasPassword": {
            "type": "boolean"
          },
          "maxBytesPerUpload": {
            "type": [
              "number",
              "null"
            ]
          },
          "expiresAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "notifyOnUpload": {
            "type": "boolean"
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "paused",
              "revoked"
            ]
          },
          "uploadCount": {
            "type": "integer"
          },
          "bytesReceived": {
            "type": "number"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "uploads": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PortalUpload"
            }
          }
        },
        "required": [
          "id",
          "slug",
          "url",
          "title",
          "message",
          "targetPath",
          "requireEmail",
          "hasPassword",
          "maxBytesPerUpload",
          "expiresAt",
          "notifyOnUpload",
          "status",
          "uploadCount",
          "bytesReceived",
          "createdAt",
          "uploads"
        ],
        "additionalProperties": true
      },
      "Webhook": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "disabled"
            ]
          },
          "failureCount": {
            "type": "integer"
          },
          "lastDeliveryAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          }
        },
        "required": [
          "id",
          "url",
          "description",
          "events",
          "status",
          "failureCount",
          "lastDeliveryAt",
          "createdAt"
        ],
        "additionalProperties": true
      },
      "WebhookCreated": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "disabled"
            ]
          },
          "failureCount": {
            "type": "integer"
          },
          "lastDeliveryAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "secret": {
            "type": "string",
            "description": "Signing secret, shown once"
          }
        },
        "required": [
          "id",
          "url",
          "description",
          "events",
          "status",
          "failureCount",
          "lastDeliveryAt",
          "createdAt",
          "secret"
        ],
        "additionalProperties": true
      },
      "WebhookSecret": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "secret": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "secret"
        ]
      },
      "WebhookDelivery": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "eventId": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "delivered",
              "failed"
            ]
          },
          "attempts": {
            "type": "integer"
          },
          "nextAttemptAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "lastStatusCode": {
            "type": [
              "integer",
              "null"
            ]
          },
          "lastError": {
            "type": [
              "string",
              "null"
            ]
          },
          "deliveredAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          }
        },
        "required": [
          "id",
          "eventId",
          "type",
          "status",
          "attempts",
          "nextAttemptAt",
          "lastStatusCode",
          "lastError",
          "deliveredAt",
          "createdAt"
        ],
        "additionalProperties": true
      },
      "DeliveryQueued": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "status": {
            "const": "pending",
            "type": "string"
          }
        },
        "required": [
          "id",
          "status"
        ]
      },
      "TestQueued": {
        "type": "object",
        "properties": {
          "eventId": {
            "type": "string"
          },
          "deliveryId": {
            "type": "string"
          }
        },
        "required": [
          "eventId"
        ]
      },
      "EventCatalogue": {
        "type": "object",
        "properties": {
          "events": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "events"
        ]
      },
      "WorkspaceEvent": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "data": {
            "type": "object",
            "additionalProperties": {}
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          }
        },
        "required": [
          "id",
          "type",
          "data",
          "createdAt"
        ]
      },
      "UsageSnapshot": {
        "type": "object",
        "properties": {
          "takenAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp"
          },
          "bytesStored": {
            "type": "number"
          },
          "fileCount": {
            "type": "integer"
          },
          "bytesIn30d": {
            "type": "number"
          },
          "bytesOut30d": {
            "type": "number"
          }
        },
        "required": [
          "takenAt",
          "bytesStored",
          "fileCount",
          "bytesIn30d",
          "bytesOut30d"
        ],
        "additionalProperties": true
      },
      "UsageSummary": {
        "type": "object",
        "properties": {
          "quotaBytes": {
            "type": "number"
          },
          "planCode": {
            "type": "string"
          },
          "percent": {
            "type": [
              "number",
              "null"
            ]
          },
          "level": {
            "type": "integer"
          },
          "uploadsBlocked": {
            "type": "boolean"
          },
          "latest": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UsageSnapshot"
              },
              {
                "type": "null"
              }
            ]
          },
          "history": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UsageSnapshot"
            }
          }
        },
        "required": [
          "quotaBytes",
          "planCode",
          "percent",
          "level",
          "uploadsBlocked",
          "latest",
          "history"
        ],
        "additionalProperties": true
      },
      "Bandwidth": {
        "type": "object",
        "properties": {
          "days": {
            "type": "integer"
          }
        },
        "required": [
          "days"
        ],
        "additionalProperties": true
      },
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "unauthenticated",
                  "email_unverified",
                  "mfa_required",
                  "forbidden",
                  "not_found",
                  "validation_failed",
                  "path_rejected",
                  "quota_exceeded",
                  "scheduled_hold",
                  "plan_limit",
                  "rate_limited",
                  "share_expired",
                  "share_locked",
                  "node_unavailable",
                  "node_busy",
                  "conflict",
                  "internal",
                  "authorization_pending",
                  "slow_down",
                  "access_denied",
                  "expired_token"
                ]
              },
              "message": {
                "type": "string"
              },
              "details": {}
            },
            "required": [
              "code",
              "message"
            ]
          }
        },
        "required": [
          "error"
        ],
        "description": "Every error response"
      }
    },
    "responses": {
      "400": {
        "description": "validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "401": {
        "description": "unauthenticated",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "403": {
        "description": "email_unverified | mfa_required | forbidden | plan_limit",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "404": {
        "description": "not_found",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "429": {
        "description": "rate_limited | node_busy",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    }
  },
  "x-boita-scopes": {
    "files:read": "List and search files, folders, versions and trash; read transfers and watch folders",
    "files:write": "Create folders, rename, delete and restore; start transfers; manage watch folders",
    "shares:write": "Create, extend and revoke share links and read their details",
    "portals:write": "Create, update and revoke upload portals and review their uploads",
    "receipts:read": "Read delivery receipts, verification reports, comments and share details",
    "webhooks:manage": "Manage webhook endpoints and REST-hook subscriptions (Zapier, Make, n8n), read deliveries, retry and test them; poll the event stream",
    "usage:read": "Read storage, bandwidth, dashboard figures and the audit log"
  }
}
