{
  "openapi": "3.1.0",
  "info": {
    "title": "RelayBox",
    "version": "1.0.0",
    "description": "Private temporary file relay. Unix-second timestamps. Cookie mutations require same Origin and X-CSRF-Token. Bearer tokens cannot manage tokens or shares."
  },
  "servers": [
    {
      "url": "https://file.leezhu.cn"
    }
  ],
  "security": [
    {
      "AgentToken": []
    },
    {
      "Session": []
    }
  ],
  "components": {
    "securitySchemes": {
      "AgentToken": {
        "type": "http",
        "scheme": "bearer"
      },
      "Session": {
        "type": "apiKey",
        "in": "cookie",
        "name": "relaybox_session"
      }
    }
  },
  "paths": {
    "/api/auth/session": {
      "get": {
        "summary": "Session and limits",
        "operationId": "get_api_auth_session",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "security": [],
        "parameters": []
      }
    },
    "/api/auth/login": {
      "post": {
        "summary": "Login",
        "operationId": "post_api_auth_login",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "security": [],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "password": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/auth/logout": {
      "post": {
        "summary": "Logout",
        "operationId": "post_api_auth_logout",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "parameters": [
          {
            "name": "X-CSRF-Token",
            "in": "header",
            "description": "Required for cookie auth only",
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/files": {
      "get": {
        "summary": "List/search",
        "operationId": "get_api_files",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          }
        ]
      }
    },
    "/api/files/{id}/download": {
      "get": {
        "summary": "Download attachment",
        "operationId": "get_api_files_id_download",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/files/{id}": {
      "delete": {
        "summary": "Delete permanently",
        "operationId": "delete_api_files_id",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-CSRF-Token",
            "in": "header",
            "description": "Required for cookie auth only",
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/uploads": {
      "post": {
        "summary": "Begin upload, reserve quota",
        "operationId": "post_api_uploads",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "parameters": [
          {
            "name": "X-CSRF-Token",
            "in": "header",
            "description": "Required for cookie auth only",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "size": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 2147483648
                  },
                  "mimeType": {
                    "type": "string"
                  },
                  "expiresInDays": {
                    "type": "number",
                    "minimum": 1,
                    "maximum": 30,
                    "default": 7
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/uploads/{id}": {
      "get": {
        "summary": "Resume status",
        "operationId": "get_api_uploads_id",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "delete": {
        "summary": "Abort upload",
        "operationId": "delete_api_uploads_id",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-CSRF-Token",
            "in": "header",
            "description": "Required for cookie auth only",
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/uploads/{id}/parts/{number}": {
      "put": {
        "summary": "Upload exact part,32MiB except last",
        "operationId": "put_api_uploads_id_parts_number",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "number",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "X-CSRF-Token",
            "in": "header",
            "description": "Required for cookie auth only",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/octet-stream": {
              "schema": {
                "type": "string",
                "format": "binary"
              }
            }
          }
        }
      }
    },
    "/api/uploads/{id}/complete": {
      "post": {
        "summary": "Complete upload",
        "operationId": "post_api_uploads_id_complete",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-CSRF-Token",
            "in": "header",
            "description": "Required for cookie auth only",
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/tokens": {
      "get": {
        "summary": "List token metadata; owner only",
        "operationId": "get_api_tokens",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "parameters": []
      },
      "post": {
        "summary": "Create token once; owner only",
        "operationId": "post_api_tokens",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "parameters": [
          {
            "name": "X-CSRF-Token",
            "in": "header",
            "description": "Required for cookie auth only",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "scopes": {
                    "type": "array",
                    "items": {
                      "enum": [
                        "files:read",
                        "files:write",
                        "files:delete"
                      ]
                    }
                  },
                  "fileId": {
                    "type": "string"
                  },
                  "expiresInDays": {
                    "type": "number",
                    "minimum": 0.041666666666666664,
                    "maximum": 90
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/tokens/{id}": {
      "delete": {
        "summary": "Revoke token; owner only",
        "operationId": "delete_api_tokens_id",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-CSRF-Token",
            "in": "header",
            "description": "Required for cookie auth only",
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/files/{id}/shares": {
      "get": {
        "summary": "List shares; owner only",
        "operationId": "get_api_files_id_shares",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "post": {
        "summary": "Create share; owner only",
        "operationId": "post_api_files_id_shares",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-CSRF-Token",
            "in": "header",
            "description": "Required for cookie auth only",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "password": {
                    "type": "string",
                    "minLength": 8
                  },
                  "expiresInHours": {
                    "type": "number",
                    "minimum": 0.25,
                    "maximum": 720
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/shares/{id}": {
      "delete": {
        "summary": "Revoke share; owner only",
        "operationId": "delete_api_shares_id",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-CSRF-Token",
            "in": "header",
            "description": "Required for cookie auth only",
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/share/{secret}": {
      "get": {
        "summary": "Share metadata",
        "operationId": "get_api_share_secret",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "security": [],
        "parameters": [
          {
            "name": "secret",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/share/{secret}/access": {
      "post": {
        "summary": "Unlock share",
        "operationId": "post_api_share_secret_access",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "security": [],
        "parameters": [
          {
            "name": "secret",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "password": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/share/{secret}/download": {
      "get": {
        "summary": "Download share",
        "operationId": "get_api_share_secret_download",
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Invalid request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Scope,Origin or CSRF denied"
          },
          "404": {
            "description": "Not found,expired or revoked"
          },
          "409": {
            "description": "Conflict or quota"
          },
          "413": {
            "description": "Body too large"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Owner setup required"
          }
        },
        "security": [],
        "parameters": [
          {
            "name": "secret",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    }
  }
}
