{
  "openapi": "3.0.1",
  "info": {
    "title": "Kavita",
    "description": "Kavita provides a set of APIs that are authenticated by JWT. JWT token can be copied from local storage.",
    "license": {
      "name": "GPL-3.0",
      "url": "https://github.com/Kareadita/Kavita/blob/develop/LICENSE"
    },
    "version": "0.7.6.15"
  },
  "servers": [
    {
      "url": "{protocol}://{hostpath}",
      "variables": {
        "protocol": {
          "default": "http",
          "enum": [
            "http",
            "https"
          ]
        },
        "hostpath": {
          "default": "localhost:5000"
        }
      }
    }
  ],
  "paths": {
    "/api/Account/reset-password": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Update a user's password",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResetPasswordDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ResetPasswordDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ResetPasswordDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Account/register": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Register the first user (admin) on the server. Will not do anything if an admin is already confirmed",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/login": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Perform a login. Will send JWT Token of the logged in user back.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LoginDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/LoginDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/LoginDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/refresh-account": {
      "get": {
        "tags": [
          "Account"
        ],
        "summary": "Returns an up-to-date user account",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/refresh-token": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Refreshes the user's JWT token",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TokenRequestDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/TokenRequestDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/TokenRequestDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/TokenRequestDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenRequestDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenRequestDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/roles": {
      "get": {
        "tags": [
          "Account"
        ],
        "summary": "Get All Roles back. See API.Constants.PolicyConstants",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/reset-api-key": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Resets the API Key assigned with a user",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/update/email": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Initiates the flow to update a user's email address. The email address is not changed in this API. A confirmation link is sent/dumped which will\r\nvalidate the email. It must be confirmed for the email to update.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateEmailDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateEmailDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateEmailDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Account/update/age-restriction": {
      "post": {
        "tags": [
          "Account"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateAgeRestrictionDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateAgeRestrictionDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateAgeRestrictionDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Account/update": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Update the user account. This can only affect Username, Email (will require confirming), Roles, and Library access.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Account/invite-url": {
      "get": {
        "tags": [
          "Account"
        ],
        "summary": "Requests the Invite Url for the UserId. Will return error if user is already validated.",
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "withBaseUrl",
            "in": "query",
            "description": "Include the \"https://ip:port/\" in the generated link",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/invite": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Invites a user to the server. Will generate a setup link for continuing setup. If the server is not accessible, no\r\nemail will be sent.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InviteUserDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/InviteUserDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/InviteUserDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/confirm-email": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Last step in authentication flow, confirms the email token for email",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmEmailDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmEmailDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmEmailDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/confirm-email-update": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Final step in email update change. Given a confirmation token and the email, this will finish the email change.",
        "description": "This will force connected clients to re-authenticate",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmEmailUpdateDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmEmailUpdateDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmEmailUpdateDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Account/confirm-password-reset": {
      "post": {
        "tags": [
          "Account"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmPasswordResetDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmPasswordResetDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmPasswordResetDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/forgot-password": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Will send user a link to update their password to their email or prompt them if not accessible",
        "parameters": [
          {
            "name": "email",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/email-confirmed": {
      "get": {
        "tags": [
          "Account"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/confirm-migration-email": {
      "post": {
        "tags": [
          "Account"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmMigrationEmailDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmMigrationEmailDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmMigrationEmailDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/resend-confirmation-email": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Resend an invite to a user already invited",
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/migrate-email": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "This is similar to invite. Essentially we authenticate the user's password then go through invite email flow",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MigrateUserEmailDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MigrateUserEmailDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MigrateUserEmailDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/opds-url": {
      "get": {
        "tags": [
          "Account"
        ],
        "summary": "Returns the OPDS url for this user",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Admin/exists": {
      "get": {
        "tags": [
          "Admin"
        ],
        "summary": "Checks if an admin exists on the system. This is essentially a check to validate if the system has been setup.",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Book/{chapterId}/book-info": {
      "get": {
        "tags": [
          "Book"
        ],
        "summary": "Retrieves information for the PDF and Epub reader",
        "description": "This only applies to Epub or PDF files",
        "parameters": [
          {
            "name": "chapterId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BookInfoDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookInfoDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookInfoDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Book/{chapterId}/book-resources": {
      "get": {
        "tags": [
          "Book"
        ],
        "summary": "This is an entry point to fetch resources from within an epub chapter/book.",
        "parameters": [
          {
            "name": "chapterId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "file",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Book/{chapterId}/chapters": {
      "get": {
        "tags": [
          "Book"
        ],
        "summary": "This will return a list of mappings from ID -> page num. ID will be the xhtml key and page num will be the reading order\r\nthis is used to rewrite anchors in the book text so that we always load properly in our reader.",
        "description": "This is essentially building the table of contents",
        "parameters": [
          {
            "name": "chapterId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookChapterItem"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookChapterItem"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookChapterItem"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Book/{chapterId}/book-page": {
      "get": {
        "tags": [
          "Book"
        ],
        "summary": "This returns a single page within the epub book. All html will be rewritten to be scoped within our reader,\r\nall css is scoped, etc.",
        "parameters": [
          {
            "name": "chapterId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Cbl/validate": {
      "post": {
        "tags": [
          "Cbl"
        ],
        "summary": "The first step in a cbl import. This validates the cbl file that if an import occured, would it be successful.\r\nIf this returns errors, the cbl will always be rejected by Kavita.",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "ContentType": {
                    "type": "string"
                  },
                  "ContentDisposition": {
                    "type": "string"
                  },
                  "Headers": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "Length": {
                    "type": "integer",
                    "format": "int64"
                  },
                  "Name": {
                    "type": "string"
                  },
                  "FileName": {
                    "type": "string"
                  }
                }
              },
              "encoding": {
                "ContentType": {
                  "style": "form"
                },
                "ContentDisposition": {
                  "style": "form"
                },
                "Headers": {
                  "style": "form"
                },
                "Length": {
                  "style": "form"
                },
                "Name": {
                  "style": "form"
                },
                "FileName": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/CblImportSummaryDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CblImportSummaryDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/CblImportSummaryDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Cbl/import": {
      "post": {
        "tags": [
          "Cbl"
        ],
        "summary": "Performs the actual import (assuming dryRun = false)",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "ContentType": {
                    "type": "string"
                  },
                  "ContentDisposition": {
                    "type": "string"
                  },
                  "Headers": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "Length": {
                    "type": "integer",
                    "format": "int64"
                  },
                  "Name": {
                    "type": "string"
                  },
                  "FileName": {
                    "type": "string"
                  },
                  "dryRun": {
                    "type": "boolean",
                    "default": false
                  }
                }
              },
              "encoding": {
                "ContentType": {
                  "style": "form"
                },
                "ContentDisposition": {
                  "style": "form"
                },
                "Headers": {
                  "style": "form"
                },
                "Length": {
                  "style": "form"
                },
                "Name": {
                  "style": "form"
                },
                "FileName": {
                  "style": "form"
                },
                "dryRun": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/CblImportSummaryDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CblImportSummaryDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/CblImportSummaryDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Collection": {
      "get": {
        "tags": [
          "Collection"
        ],
        "summary": "Return a list of all collection tags on the server",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CollectionTagDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CollectionTagDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CollectionTagDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Collection/search": {
      "get": {
        "tags": [
          "Collection"
        ],
        "summary": "Searches against the collection tags on the DB and returns matches that meet the search criteria.\r\n<remarks>Search strings will be cleaned of certain fields, like %</remarks>",
        "parameters": [
          {
            "name": "queryString",
            "in": "query",
            "description": "Search term",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CollectionTagDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CollectionTagDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CollectionTagDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Collection/name-exists": {
      "get": {
        "tags": [
          "Collection"
        ],
        "summary": "Checks if a collection exists with the name",
        "parameters": [
          {
            "name": "name",
            "in": "query",
            "description": "If empty or null, will return true as that is invalid",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Collection/update": {
      "post": {
        "tags": [
          "Collection"
        ],
        "summary": "Updates an existing tag with a new title, promotion status, and summary.\r\n<remarks>UI does not contain controls to update title</remarks>",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CollectionTagDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CollectionTagDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CollectionTagDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Collection/update-for-series": {
      "post": {
        "tags": [
          "Collection"
        ],
        "summary": "Adds a collection tag onto multiple Series. If tag id is 0, this will create a new tag.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CollectionTagBulkAddDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CollectionTagBulkAddDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CollectionTagBulkAddDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Collection/update-series": {
      "post": {
        "tags": [
          "Collection"
        ],
        "summary": "For a given tag, update the summary if summary has changed and remove a set of series from the tag.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesForTagDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesForTagDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesForTagDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Device/create": {
      "post": {
        "tags": [
          "Device"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateDeviceDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateDeviceDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateDeviceDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Device/update": {
      "post": {
        "tags": [
          "Device"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDeviceDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDeviceDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDeviceDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Device": {
      "delete": {
        "tags": [
          "Device"
        ],
        "summary": "Deletes the device from the user",
        "parameters": [
          {
            "name": "deviceId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      },
      "get": {
        "tags": [
          "Device"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DeviceDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DeviceDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DeviceDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Device/send-to": {
      "post": {
        "tags": [
          "Device"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SendToDeviceDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SendToDeviceDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SendToDeviceDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Device/send-series-to": {
      "post": {
        "tags": [
          "Device"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SendSeriesToDeviceDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SendSeriesToDeviceDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SendSeriesToDeviceDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Download/volume-size": {
      "get": {
        "tags": [
          "Download"
        ],
        "summary": "For a given volume, return the size in bytes",
        "parameters": [
          {
            "name": "volumeId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              },
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              },
              "text/json": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              }
            }
          }
        }
      }
    },
    "/api/Download/chapter-size": {
      "get": {
        "tags": [
          "Download"
        ],
        "summary": "For a given chapter, return the size in bytes",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              },
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              },
              "text/json": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              }
            }
          }
        }
      }
    },
    "/api/Download/series-size": {
      "get": {
        "tags": [
          "Download"
        ],
        "summary": "For a series, return the size in bytes",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              },
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              },
              "text/json": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              }
            }
          }
        }
      }
    },
    "/api/Download/volume": {
      "get": {
        "tags": [
          "Download"
        ],
        "summary": "Downloads all chapters within a volume. If the chapters are multiple zips, they will all be zipped up.",
        "parameters": [
          {
            "name": "volumeId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Download/chapter": {
      "get": {
        "tags": [
          "Download"
        ],
        "summary": "Returns the zip for a single chapter. If the chapter contains multiple files, they will be zipped.",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Download/series": {
      "get": {
        "tags": [
          "Download"
        ],
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Download/bookmarks": {
      "post": {
        "tags": [
          "Download"
        ],
        "summary": "Downloads all bookmarks in a zip for",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DownloadBookmarkDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DownloadBookmarkDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DownloadBookmarkDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Health": {
      "get": {
        "tags": [
          "Health"
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Image/chapter-cover": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns cover image for Chapter",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Image/library-cover": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns cover image for Library",
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Image/volume-cover": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns cover image for Volume",
        "parameters": [
          {
            "name": "volumeId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Image/series-cover": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns cover image for Series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "Id of Series",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Image/collection-cover": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns cover image for Collection Tag",
        "parameters": [
          {
            "name": "collectionTagId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Image/readinglist-cover": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns cover image for a Reading List",
        "parameters": [
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Image/bookmark": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns image for a given bookmark page",
        "description": "This request is served unauthenticated, but user must be passed via api key to validate",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageNum",
            "in": "query",
            "description": "Starts at 0",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "query",
            "description": "API Key for user. Needed to authenticate request",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Image/web-link": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns the image associated with a web-link",
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "apiKey",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Image/cover-upload": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns a temp coverupload image",
        "parameters": [
          {
            "name": "filename",
            "in": "query",
            "description": "Filename of file. This is used with upload/upload-by-url",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "apiKey",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Library/create": {
      "post": {
        "tags": [
          "Library"
        ],
        "summary": "Creates a new Library. Upon library creation, adds new library to all Admin accounts.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLibraryDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLibraryDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLibraryDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Library/list": {
      "get": {
        "tags": [
          "Library"
        ],
        "summary": "Returns a list of directories for a given path. If path is empty, returns root drives.",
        "parameters": [
          {
            "name": "path",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DirectoryDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DirectoryDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DirectoryDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Library": {
      "get": {
        "tags": [
          "Library"
        ],
        "summary": "Return all libraries in the Server",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LibraryDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LibraryDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LibraryDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Library/jump-bar": {
      "get": {
        "tags": [
          "Library"
        ],
        "summary": "For a given library, generate the jump bar information",
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/JumpKeyDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/JumpKeyDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/JumpKeyDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Library/grant-access": {
      "post": {
        "tags": [
          "Library"
        ],
        "summary": "Grants a user account access to a Library",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLibraryForUserDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLibraryForUserDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLibraryForUserDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/MemberDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemberDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemberDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Library/scan": {
      "post": {
        "tags": [
          "Library"
        ],
        "summary": "Scans a given library for file changes.",
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "force",
            "in": "query",
            "description": "If true, will ignore any optimizations to avoid file I/O and will treat similar to a first scan",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Library/scan-all": {
      "post": {
        "tags": [
          "Library"
        ],
        "summary": "Scans a given library for file changes. If another scan task is in progress, will reschedule the invocation for 3 hours in future.",
        "parameters": [
          {
            "name": "force",
            "in": "query",
            "description": "If true, will ignore any optimizations to avoid file I/O and will treat similar to a first scan",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Library/refresh-metadata": {
      "post": {
        "tags": [
          "Library"
        ],
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "force",
            "in": "query",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Library/analyze": {
      "post": {
        "tags": [
          "Library"
        ],
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Library/scan-folder": {
      "post": {
        "tags": [
          "Library"
        ],
        "summary": "Given a valid path, will invoke either a Scan Series or Scan Library. If the folder does not exist within Kavita, the request will be ignored",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScanFolderDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ScanFolderDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ScanFolderDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Library/delete": {
      "delete": {
        "tags": [
          "Library"
        ],
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Library/name-exists": {
      "get": {
        "tags": [
          "Library"
        ],
        "summary": "Checks if the library name exists or not",
        "parameters": [
          {
            "name": "name",
            "in": "query",
            "description": "If empty or null, will return true as that is invalid",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Library/update": {
      "post": {
        "tags": [
          "Library"
        ],
        "summary": "Updates an existing Library with new name, folders, and/or type.",
        "description": "Any folder or type change will invoke a scan.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLibraryDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLibraryDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLibraryDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Library/type": {
      "get": {
        "tags": [
          "Library"
        ],
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "enum": [
                    0,
                    1,
                    2
                  ],
                  "type": "integer",
                  "format": "int32"
                }
              },
              "application/json": {
                "schema": {
                  "enum": [
                    0,
                    1,
                    2
                  ],
                  "type": "integer",
                  "format": "int32"
                }
              },
              "text/json": {
                "schema": {
                  "enum": [
                    0,
                    1,
                    2
                  ],
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/License/valid-license": {
      "get": {
        "tags": [
          "License"
        ],
        "summary": "Checks if the user's license is valid or not",
        "parameters": [
          {
            "name": "forceCheck",
            "in": "query",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/License/has-license": {
      "get": {
        "tags": [
          "License"
        ],
        "summary": "Has any license",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/License": {
      "delete": {
        "tags": [
          "License"
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      },
      "post": {
        "tags": [
          "License"
        ],
        "summary": "Updates server license",
        "description": "Caches the result",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLicenseDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLicenseDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLicenseDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Locale": {
      "get": {
        "tags": [
          "Locale"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Metadata/genres": {
      "get": {
        "tags": [
          "Metadata"
        ],
        "summary": "Fetches genres from the instance",
        "parameters": [
          {
            "name": "libraryIds",
            "in": "query",
            "description": "String separated libraryIds or null for all genres",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/GenreTagDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/GenreTagDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/GenreTagDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Metadata/people": {
      "get": {
        "tags": [
          "Metadata"
        ],
        "summary": "Fetches people from the instance",
        "parameters": [
          {
            "name": "libraryIds",
            "in": "query",
            "description": "String separated libraryIds or null for all people",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Metadata/tags": {
      "get": {
        "tags": [
          "Metadata"
        ],
        "summary": "Fetches all tags from the instance",
        "parameters": [
          {
            "name": "libraryIds",
            "in": "query",
            "description": "String separated libraryIds or null for all tags",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TagDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TagDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TagDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Metadata/age-ratings": {
      "get": {
        "tags": [
          "Metadata"
        ],
        "summary": "Fetches all age ratings from the instance",
        "description": "This API is cached for 1 hour, varying by libraryIds",
        "parameters": [
          {
            "name": "libraryIds",
            "in": "query",
            "description": "String separated libraryIds or null for all ratings",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AgeRatingDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AgeRatingDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AgeRatingDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Metadata/publication-status": {
      "get": {
        "tags": [
          "Metadata"
        ],
        "summary": "Fetches all publication status' from the instance",
        "description": "This API is cached for 1 hour, varying by libraryIds",
        "parameters": [
          {
            "name": "libraryIds",
            "in": "query",
            "description": "String separated libraryIds or null for all publication status",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AgeRatingDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AgeRatingDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AgeRatingDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Metadata/languages": {
      "get": {
        "tags": [
          "Metadata"
        ],
        "summary": "Fetches all age languages from the libraries passed (or if none passed, all in the server)",
        "description": "This does not perform RBS for the user if they have Library access due to the non-sensitive nature of languages",
        "parameters": [
          {
            "name": "libraryIds",
            "in": "query",
            "description": "String separated libraryIds or null for all ratings",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LanguageDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LanguageDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LanguageDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Metadata/all-languages": {
      "get": {
        "tags": [
          "Metadata"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LanguageDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LanguageDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LanguageDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Metadata/chapter-summary": {
      "get": {
        "tags": [
          "Metadata"
        ],
        "summary": "Returns summary for the chapter",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Opds/{apiKey}": {
      "post": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      },
      "get": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/libraries": {
      "get": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/collections": {
      "get": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/collections/{collectionId}": {
      "get": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "collectionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/reading-list": {
      "get": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/reading-list/{readingListId}": {
      "get": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "readingListId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/libraries/{libraryId}": {
      "get": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "libraryId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/recently-added": {
      "get": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/on-deck": {
      "get": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/series": {
      "get": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/search": {
      "get": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/series/{seriesId}": {
      "get": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "seriesId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/series/{seriesId}/volume/{volumeId}": {
      "get": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "seriesId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "volumeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/series/{seriesId}/volume/{volumeId}/chapter/{chapterId}": {
      "get": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "seriesId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "volumeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "chapterId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/series/{seriesId}/volume/{volumeId}/chapter/{chapterId}/download/{filename}": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Downloads a file",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "User's API Key",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "seriesId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "volumeId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "chapterId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "filename",
            "in": "path",
            "description": "Not used. Only for Chunky to allow download links",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/image": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "This returns a streamed image following OPDS-PS v1.2",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "libraryId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "volumeId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/favicon": {
      "get": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Plugin/authenticate": {
      "post": {
        "tags": [
          "Plugin"
        ],
        "summary": "Authenticate with the Server given an apiKey. This will log you in by returning the user object and the JWT token.",
        "description": "This API is not fully built out and may require more information in later releases",
        "parameters": [
          {
            "name": "apiKey",
            "in": "query",
            "description": "API key which will be used to authenticate and return a valid user token back",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pluginName",
            "in": "query",
            "description": "Name of the Plugin",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Rating": {
      "get": {
        "tags": [
          "Rating"
        ],
        "summary": "Get the external ratings for a given series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RatingDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RatingDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RatingDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Rating/overall": {
      "get": {
        "tags": [
          "Rating"
        ],
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/RatingDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RatingDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/RatingDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/pdf": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns the PDF for the chapterId.",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/image": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns an image for a given chapter. Will perform bounding checks",
        "description": "This will cache the chapter images for reading",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "Chapter Id",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "Page in question",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "query",
            "description": "User's API Key for authentication",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "extractPdf",
            "in": "query",
            "description": "Should Kavita extract pdf into images. Defaults to false.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/thumbnail": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns a thumbnail for the given page number",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageNum",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/bookmark-image": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns an image for a given bookmark series. Side effect: This will cache the bookmark images for reading.",
        "description": "We must use api key as bookmarks could be leaked to other users via the API",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "query",
            "description": "Api key for the user the bookmarks are on",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/file-dimensions": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns the file dimensions for all pages in a chapter. If the underlying chapter is PDF, use extractPDF to unpack as images.",
        "description": "This has a side effect of caching the images.\r\n            This will only be populated on archive filetypes and not in bookmark mode",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "extractPdf",
            "in": "query",
            "description": "",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FileDimensionDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FileDimensionDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FileDimensionDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/chapter-info": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns various information about a Chapter. Side effect: This will cache the chapter images for reading.",
        "description": "This is generally the first call when attempting to read to allow pre-generation of assets needed for reading",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "extractPdf",
            "in": "query",
            "description": "Should Kavita extract pdf into images. Defaults to false.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "includeDimensions",
            "in": "query",
            "description": "Include file dimensions. Only useful for image based reading",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterInfoDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterInfoDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterInfoDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/bookmark-info": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns various information about all bookmark files for a Series. Side effect: This will cache the bookmark images for reading.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "Series Id for all bookmarks",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "includeDimensions",
            "in": "query",
            "description": "Include file dimensions (extra I/O). Defaults to true.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BookmarkInfoDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookmarkInfoDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookmarkInfoDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/mark-read": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Marks a Series as read. All volumes and chapters will be marked as read during this process.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkReadDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkReadDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MarkReadDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/mark-unread": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Marks a Series as Unread. All volumes and chapters will be marked as unread during this process.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkReadDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkReadDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MarkReadDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/mark-volume-unread": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Marks all chapters within a volume as unread",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkVolumeReadDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkVolumeReadDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MarkVolumeReadDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/mark-volume-read": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Marks all chapters within a volume as Read",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkVolumeReadDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkVolumeReadDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MarkVolumeReadDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/mark-multiple-read": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Marks all chapters within a list of volumes as Read. All volumes must belong to the same Series.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkVolumesReadDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkVolumesReadDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MarkVolumesReadDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/mark-multiple-unread": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Marks all chapters within a list of volumes as Unread. All volumes must belong to the same Series.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkVolumesReadDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkVolumesReadDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MarkVolumesReadDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/mark-multiple-series-read": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Marks all chapters within a list of series as Read.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkMultipleSeriesAsReadDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkMultipleSeriesAsReadDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MarkMultipleSeriesAsReadDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/mark-multiple-series-unread": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Marks all chapters within a list of series as Unread.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkMultipleSeriesAsReadDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkMultipleSeriesAsReadDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MarkMultipleSeriesAsReadDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/get-progress": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns Progress (page number) for a chapter for the logged in user",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProgressDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProgressDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProgressDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/progress": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Save page against Chapter for logged in user",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProgressDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ProgressDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ProgressDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/continue-point": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Continue point is the chapter which you should start reading again from. If there is no progress on a series, then the first chapter will be returned (non-special unless only specials).\r\nOtherwise, loop through the chapters and volumes in order to find the next chapter which has progress.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/has-progress": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns if the user has reading progress on the Series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/chapter-bookmarks": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns a list of bookmarked pages for a given Chapter",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/all-bookmarks": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns a list of all bookmarked pages for a User",
        "requestBody": {
          "description": "Only supports SeriesNameQuery",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/remove-bookmarks": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Removes all bookmarks for all chapters linked to a Series",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RemoveBookmarkForSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RemoveBookmarkForSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RemoveBookmarkForSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/bulk-remove-bookmarks": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Removes all bookmarks for all chapters linked to a Series",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkRemoveBookmarkForSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkRemoveBookmarkForSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BulkRemoveBookmarkForSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/volume-bookmarks": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns all bookmarked pages for a given volume",
        "parameters": [
          {
            "name": "volumeId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/series-bookmarks": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns all bookmarked pages for a given series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/bookmark": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Bookmarks a page against a Chapter",
        "description": "This has a side effect of caching the chapter files to disk",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookmarkDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BookmarkDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BookmarkDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/unbookmark": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Removes a bookmarked page for a Chapter",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookmarkDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BookmarkDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BookmarkDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/next-chapter": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns the next logical chapter from the series.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "volumeId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "currentChapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "text/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/prev-chapter": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns the previous logical chapter from the series.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "volumeId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "currentChapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "text/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/time-left": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "For the current user, returns an estimate on how long it would take to finish reading the series.",
        "description": "For Epubs, this does not check words inside a chapter due to overhead so may not work in all cases.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/HourEstimateRangeDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HourEstimateRangeDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/HourEstimateRangeDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/ptoc": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns the user's personal table of contents for the given chapter",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonalToCDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonalToCDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonalToCDto"
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Reader"
        ],
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageNum",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "title",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Reader/create-ptoc": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Create a new personal table of content entry for a given chapter",
        "description": "The title and page number must be unique to that book",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePersonalToCDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePersonalToCDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePersonalToCDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/ReadingList": {
      "get": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Fetches a single Reading List",
        "parameters": [
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Deletes a reading list",
        "parameters": [
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/ReadingList/lists": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Returns reading lists (paginated) for a given user.",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "If set to 0, will set as MaxInt",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "includePromoted",
            "in": "query",
            "description": "Include Promoted Reading Lists along with user's Reading Lists. Defaults to true",
            "schema": {
              "type": "boolean",
              "default": true
            }
          },
          {
            "name": "sortByLastModified",
            "in": "query",
            "description": "Sort by last modified (most recent first) or by title (alphabetical)",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/lists-for-series": {
      "get": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Returns all Reading Lists the user has access to that have a series within it.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/items": {
      "get": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Fetches all reading list items for a given list including rich metadata around series, volume, chapters, and progress",
        "description": "This call is expensive",
        "parameters": [
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListItemDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListItemDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListItemDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/update-position": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Updates an items position",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListPosition"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListPosition"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListPosition"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/ReadingList/delete-item": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Deletes a list item from the list. Will reorder all item positions afterwards",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListPosition"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListPosition"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListPosition"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/ReadingList/remove-read": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Removes all entries that are fully read from the reading list",
        "parameters": [
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/ReadingList/create": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Creates a new List with a unique title. Returns the new ReadingList back",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateReadingListDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateReadingListDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateReadingListDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingListDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingListDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingListDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/update": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Update the properties (title, summary) of a reading list",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/ReadingList/update-by-series": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Adds all chapters from a Series to a reading list",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListBySeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListBySeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListBySeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/ReadingList/update-by-multiple": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Adds all chapters from a list of volumes and chapters to a reading list",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByMultipleDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByMultipleDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByMultipleDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/ReadingList/update-by-multiple-series": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Adds all chapters from a list of series to a reading list",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByMultipleSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByMultipleSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByMultipleSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/ReadingList/update-by-volume": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByVolumeDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByVolumeDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByVolumeDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/ReadingList/update-by-chapter": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByChapterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByChapterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByChapterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/ReadingList/characters": {
      "get": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Returns a list of characters associated with the reading list",
        "parameters": [
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/next-chapter": {
      "get": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Returns the next chapter within the reading list",
        "parameters": [
          {
            "name": "currentChapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "text/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/prev-chapter": {
      "get": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Returns the prev chapter within the reading list",
        "parameters": [
          {
            "name": "currentChapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "text/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/name-exists": {
      "get": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Checks if a reading list exists with the name",
        "parameters": [
          {
            "name": "name",
            "in": "query",
            "description": "If empty or null, will return true as that is invalid",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Recommended/recommendations": {
      "get": {
        "tags": [
          "Recommended"
        ],
        "summary": "For Kavita+ users, this will return recommendations on the server.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/RecommendationDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecommendationDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecommendationDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Recommended/quick-reads": {
      "get": {
        "tags": [
          "Recommended"
        ],
        "summary": "Quick Reads are series that should be readable in less than 10 in total and are not Ongoing in release.",
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "description": "Library to restrict series to",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "If set to 0, will set as MaxInt",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Recommended/quick-catchup-reads": {
      "get": {
        "tags": [
          "Recommended"
        ],
        "summary": "Quick Catchup Reads are series that should be readable in less than 10 in total and are Ongoing in release.",
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "description": "Library to restrict series to",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "If set to 0, will set as MaxInt",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Recommended/highly-rated": {
      "get": {
        "tags": [
          "Recommended"
        ],
        "summary": "Highly Rated based on other users ratings. Will pull series with ratings > 4.0, weighted by count of other users.",
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "description": "Library to restrict series to",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "If set to 0, will set as MaxInt",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Recommended/more-in": {
      "get": {
        "tags": [
          "Recommended"
        ],
        "summary": "Chooses a random genre and shows series that are in that without reading progress",
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "description": "Library to restrict series to",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "genreId",
            "in": "query",
            "description": "Genre Id",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "If set to 0, will set as MaxInt",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Recommended/rediscover": {
      "get": {
        "tags": [
          "Recommended"
        ],
        "summary": "Series that are fully read by the user in no particular order",
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "description": "Library to restrict series to",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "If set to 0, will set as MaxInt",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Review": {
      "get": {
        "tags": [
          "Review"
        ],
        "summary": "Fetches reviews from the server for a given series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserReviewDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserReviewDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserReviewDto"
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Review"
        ],
        "summary": "Updates the review for a given series",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserReviewDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserReviewDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserReviewDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserReviewDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReviewDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReviewDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/anilist-token": {
      "get": {
        "tags": [
          "Scrobbling"
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Scrobbling/update-anilist-token": {
      "post": {
        "tags": [
          "Scrobbling"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AniListUpdateDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AniListUpdateDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AniListUpdateDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Scrobbling/token-expired": {
      "get": {
        "tags": [
          "Scrobbling"
        ],
        "parameters": [
          {
            "name": "provider",
            "in": "query",
            "schema": {
              "enum": [
                0,
                1,
                2
              ],
              "type": "integer",
              "description": "Misleading name but is the source of data (like a review coming from AniList)",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/scrobble-errors": {
      "get": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Returns all scrobbling errors for the instance",
        "description": "Requires admin",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleErrorDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleErrorDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleErrorDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/clear-errors": {
      "post": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Clears the scrobbling errors table",
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Scrobbling/scrobble-events": {
      "post": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Returns the scrobbling history for the user",
        "description": "User must have a valid license",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "If set to 0, will set as MaxInt",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScrobbleEventFilter"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ScrobbleEventFilter"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ScrobbleEventFilter"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleEventDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleEventDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleEventDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/holds": {
      "get": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Returns all scrobble holds for the current user",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleHoldDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleHoldDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleHoldDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/has-hold": {
      "get": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "If there is an active hold on the series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/library-allows-scrobbling": {
      "get": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Does the library the series is in allow scrobbling?",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/add-hold": {
      "post": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Adds a hold against the Series for user's scrobbling",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Scrobbling/remove-hold": {
      "delete": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Adds a hold against the Series for user's scrobbling",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Search/series-for-mangafile": {
      "get": {
        "tags": [
          "Search"
        ],
        "summary": "Returns the series for the MangaFile id. If the user does not have access (shouldn't happen by the UI),\r\nthen null is returned",
        "parameters": [
          {
            "name": "mangaFileId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Search/series-for-chapter": {
      "get": {
        "tags": [
          "Search"
        ],
        "summary": "Returns the series for the Chapter id. If the user does not have access (shouldn't happen by the UI),\r\nthen null is returned",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Search/search": {
      "get": {
        "tags": [
          "Search"
        ],
        "parameters": [
          {
            "name": "queryString",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResultGroupDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResultGroupDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResultGroupDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Series": {
      "post": {
        "tags": [
          "Series"
        ],
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "If set to 0, will set as MaxInt",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Series"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Series"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Series"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/{seriesId}": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Fetches a Series for a given Id",
        "parameters": [
          {
            "name": "seriesId",
            "in": "path",
            "description": "Series Id to fetch details for",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Series"
        ],
        "parameters": [
          {
            "name": "seriesId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/delete-multiple": {
      "post": {
        "tags": [
          "Series"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Series/volumes": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Returns All volumes for a series with progress information and Chapters",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/VolumeDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/VolumeDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/VolumeDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/volume": {
      "get": {
        "tags": [
          "Series"
        ],
        "parameters": [
          {
            "name": "volumeId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/chapter": {
      "get": {
        "tags": [
          "Series"
        ],
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/chapter-metadata": {
      "get": {
        "tags": [
          "Series"
        ],
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterMetadataDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterMetadataDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterMetadataDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/update-rating": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Update the user rating for the given series",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesRatingDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesRatingDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesRatingDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Series/update": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Updates the Series",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Series/recently-added": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Gets all recently added series",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "If set to 0, will set as MaxInt",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "libraryId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/recently-updated-series": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Returns series that were recently updated, like adding or removing a chapter",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RecentlyAddedItemDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RecentlyAddedItemDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RecentlyAddedItemDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/all": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Returns all series for the library",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "If set to 0, will set as MaxInt",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "libraryId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/on-deck": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Fetches series that are on deck aka have progress on them.",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "If set to 0, will set as MaxInt",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "libraryId",
            "in": "query",
            "description": "Default of 0 meaning all libraries",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/remove-from-on-deck": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Removes a series from displaying on deck until the next read event on that series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Series/refresh-metadata": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Runs a Cover Image Generation task",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Series/scan": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Scan a series and force each file to be updated. This should be invoked via the User, hence why we force.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Series/analyze": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Run a file analysis on the series.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Series/metadata": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Returns metadata for a given series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesMetadataDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesMetadataDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesMetadataDto"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Update series metadata",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesMetadataDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesMetadataDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesMetadataDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Series/series-by-collection": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Returns all Series grouped by the passed Collection Id with Pagination.",
        "parameters": [
          {
            "name": "collectionId",
            "in": "query",
            "description": "Collection Id to pull series from",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "If set to 0, will set as MaxInt",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/series-by-ids": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Fetches Series for a set of Ids. This will check User for permission access and filter out any Ids that don't exist or\r\nthe user does not have access to.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesByIdsDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesByIdsDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesByIdsDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/age-rating": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Get the age rating for the API.Entities.Enums.AgeRating enum value",
        "description": "This is cached for an hour",
        "parameters": [
          {
            "name": "ageRating",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/series-detail": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Get a special DTO for Series Detail page.",
        "description": "Do not rely on this API externally. May change without hesitation.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDetailDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDetailDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDetailDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/related": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Fetches the related series for a given series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "relation",
            "in": "query",
            "description": "Type of Relationship to pull back",
            "schema": {
              "enum": [
                1,
                2,
                3,
                4,
                5,
                6,
                7,
                8,
                9,
                10,
                11,
                12,
                13
              ],
              "type": "integer",
              "description": "Represents a relationship between Series",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/all-related": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Returns all related series against the passed series Id",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/RelatedSeriesDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RelatedSeriesDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/RelatedSeriesDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/update-related": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Update the relations attached to the Series. Does not generate associated Sequel/Prequel pairs on target series.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRelatedSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRelatedSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRelatedSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Server/clear-cache": {
      "post": {
        "tags": [
          "Server"
        ],
        "summary": "Performs an ad-hoc cleanup of Cache",
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Server/cleanup-want-to-read": {
      "post": {
        "tags": [
          "Server"
        ],
        "summary": "Performs an ad-hoc cleanup of Want To Read, by removing want to read series for users, where the series are fully read and in Completed publication status.",
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Server/backup-db": {
      "post": {
        "tags": [
          "Server"
        ],
        "summary": "Performs an ad-hoc backup of the Database",
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Server/analyze-files": {
      "post": {
        "tags": [
          "Server"
        ],
        "summary": "This is a one time task that needs to be ran for v0.7 statistics to work",
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Server/server-info": {
      "get": {
        "tags": [
          "Server"
        ],
        "summary": "Returns non-sensitive information about the current system",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ServerInfoDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerInfoDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerInfoDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Server/server-info-slim": {
      "get": {
        "tags": [
          "Server"
        ],
        "summary": "Returns non-sensitive information about the current system",
        "description": "This is just for the UI and is extremely lightweight",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ServerInfoDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerInfoDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerInfoDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Server/convert-media": {
      "post": {
        "tags": [
          "Server"
        ],
        "summary": "Triggers the scheduling of the convert media job. This will convert all media to the target encoding (except for PNG). Only one job will run at a time.",
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Server/logs": {
      "get": {
        "tags": [
          "Server"
        ],
        "summary": "Downloads all the log files via a zip",
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Server/check-update": {
      "get": {
        "tags": [
          "Server"
        ],
        "summary": "Checks for updates, if no updates that are > current version installed, returns null",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateNotificationDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateNotificationDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateNotificationDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Server/changelog": {
      "get": {
        "tags": [
          "Server"
        ],
        "summary": "Pull the Changelog for Kavita from Github and display",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UpdateNotificationDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UpdateNotificationDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UpdateNotificationDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Server/accessible": {
      "get": {
        "tags": [
          "Server"
        ],
        "summary": "Is this server accessible to the outside net",
        "description": "If the instance has the HostName set, this will return true whether or not it is accessible externally",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Server/jobs": {
      "get": {
        "tags": [
          "Server"
        ],
        "summary": "Returns a list of reoccurring jobs. Scheduled ad-hoc jobs will not be returned.",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/JobDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/JobDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/JobDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Server/media-errors": {
      "get": {
        "tags": [
          "Server"
        ],
        "summary": "Returns a list of issues found during scanning or reading in which files may have corruption or bad metadata (structural metadata)",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MediaErrorDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MediaErrorDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MediaErrorDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Server/clear-media-alerts": {
      "post": {
        "tags": [
          "Server"
        ],
        "summary": "Deletes all media errors",
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Server/bust-review-and-rec-cache": {
      "post": {
        "tags": [
          "Server"
        ],
        "summary": "Bust Kavita+ Cache",
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Settings/base-url": {
      "get": {
        "tags": [
          "Settings"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings": {
      "get": {
        "tags": [
          "Settings"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Settings"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServerSettingDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ServerSettingDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ServerSettingDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/reset": {
      "post": {
        "tags": [
          "Settings"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/reset-ip-addresses": {
      "post": {
        "tags": [
          "Settings"
        ],
        "summary": "Resets the IP Addresses",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/reset-base-url": {
      "post": {
        "tags": [
          "Settings"
        ],
        "summary": "Resets the Base url",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/reset-email-url": {
      "post": {
        "tags": [
          "Settings"
        ],
        "summary": "Resets the email service url",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/test-email-url": {
      "post": {
        "tags": [
          "Settings"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TestEmailDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/TestEmailDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/TestEmailDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/EmailTestResultDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailTestResultDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailTestResultDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/task-frequencies": {
      "get": {
        "tags": [
          "Settings"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/library-types": {
      "get": {
        "tags": [
          "Settings"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/log-levels": {
      "get": {
        "tags": [
          "Settings"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/opds-enabled": {
      "get": {
        "tags": [
          "Settings"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/user/{userId}/read": {
      "get": {
        "tags": [
          "Stats"
        ],
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadStatistics"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadStatistics"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadStatistics"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/server/stats": {
      "get": {
        "tags": [
          "Stats"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ServerStatisticsDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerStatisticsDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerStatisticsDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/server/count/year": {
      "get": {
        "tags": [
          "Stats"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/server/count/publication-status": {
      "get": {
        "tags": [
          "Stats"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PublicationStatusStatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PublicationStatusStatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PublicationStatusStatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/server/count/manga-format": {
      "get": {
        "tags": [
          "Stats"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MangaFormatStatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MangaFormatStatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MangaFormatStatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/server/top/years": {
      "get": {
        "tags": [
          "Stats"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/server/top/users": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Returns users with the top reads in the server",
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TopReadDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TopReadDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TopReadDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/server/file-breakdown": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "A breakdown of different files, their size, and format",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FileExtensionBreakdownDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FileExtensionBreakdownDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FileExtensionBreakdownDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/reading-count-by-day": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Returns reading history events for a give or all users, broken up by day, and format",
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "description": "If 0, defaults to all users, else just userId",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "days",
            "in": "query",
            "description": "If 0, defaults to all time, else just those days asked for",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DateTimePagesReadOnADayCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DateTimePagesReadOnADayCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DateTimePagesReadOnADayCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/day-breakdown": {
      "get": {
        "tags": [
          "Stats"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DayOfWeekStatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DayOfWeekStatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DayOfWeekStatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/user/reading-history": {
      "get": {
        "tags": [
          "Stats"
        ],
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadHistoryEvent"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadHistoryEvent"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadHistoryEvent"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/pages-per-year": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Returns a count of pages read per year for a given userId.",
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "description": "If userId is 0 and user is not an admin, API will default to userId",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/words-per-year": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Returns a count of words read per year for a given userId.",
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "description": "If userId is 0 and user is not an admin, API will default to userId",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Tachiyomi/latest-chapter": {
      "get": {
        "tags": [
          "Tachiyomi"
        ],
        "summary": "Given the series Id, this should return the latest chapter that has been fully read.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Tachiyomi/mark-chapter-until-as-read": {
      "post": {
        "tags": [
          "Tachiyomi"
        ],
        "summary": "Marks every chapter that is sorted below the passed number as Read. This will not mark any specials as read.",
        "description": "This is built for Tachiyomi and is not expected to be called by any other place",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "chapterNumber",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "float"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Theme": {
      "get": {
        "tags": [
          "Theme"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SiteThemeDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SiteThemeDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SiteThemeDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Theme/scan": {
      "post": {
        "tags": [
          "Theme"
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Theme/update-default": {
      "post": {
        "tags": [
          "Theme"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDefaultThemeDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDefaultThemeDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDefaultThemeDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Theme/download-content": {
      "get": {
        "tags": [
          "Theme"
        ],
        "summary": "Returns css content to the UI. UI is expected to escape the content",
        "parameters": [
          {
            "name": "themeId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Upload/upload-by-url": {
      "post": {
        "tags": [
          "Upload"
        ],
        "summary": "This stores a file (image) in temp directory for use in a cover image replacement flow.\r\nThis is automatically cleaned up.",
        "requestBody": {
          "description": "Escaped url to download from",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadUrlDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadUrlDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UploadUrlDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Upload/series": {
      "post": {
        "tags": [
          "Upload"
        ],
        "summary": "Replaces series cover image and locks it with a base64 encoded image",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Upload/collection": {
      "post": {
        "tags": [
          "Upload"
        ],
        "summary": "Replaces collection tag cover image and locks it with a base64 encoded image",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Upload/reading-list": {
      "post": {
        "tags": [
          "Upload"
        ],
        "summary": "Replaces reading list cover image and locks it with a base64 encoded image",
        "description": "This is the only API that can be called by non-admins, but the authenticated user must have a readinglist permission",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Upload/chapter": {
      "post": {
        "tags": [
          "Upload"
        ],
        "summary": "Replaces chapter cover image and locks it with a base64 encoded image. This will update the parent volume's cover image.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Upload/library": {
      "post": {
        "tags": [
          "Upload"
        ],
        "summary": "Replaces library cover image with a base64 encoded image. If empty string passed, will reset to null.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Upload/reset-chapter-lock": {
      "post": {
        "tags": [
          "Upload"
        ],
        "summary": "Replaces chapter cover image and locks it with a base64 encoded image. This will update the parent volume's cover image.",
        "requestBody": {
          "description": "Does not use Url property",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UploadFileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Users/delete-user": {
      "delete": {
        "tags": [
          "Users"
        ],
        "parameters": [
          {
            "name": "username",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/Users": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Returns all users of this server",
        "parameters": [
          {
            "name": "includePending",
            "in": "query",
            "description": "This will include pending members",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MemberDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MemberDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MemberDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Users/myself": {
      "get": {
        "tags": [
          "Users"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MemberDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MemberDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MemberDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Users/has-reading-progress": {
      "get": {
        "tags": [
          "Users"
        ],
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Users/has-library-access": {
      "get": {
        "tags": [
          "Users"
        ],
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Users/update-preferences": {
      "post": {
        "tags": [
          "Users"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserPreferencesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UserPreferencesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UserPreferencesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserPreferencesDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserPreferencesDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserPreferencesDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Users/get-preferences": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Returns the preferences of the user",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserPreferencesDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserPreferencesDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserPreferencesDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Users/names": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Returns a list of the user names within the system",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/want-to-read": {
      "post": {
        "tags": [
          "WantToRead"
        ],
        "summary": "Return all Series that are in the current logged in user's Want to Read list, filtered",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "If set to 0, will set as MaxInt",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/FilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "WantToRead"
        ],
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/want-to-read/add-series": {
      "post": {
        "tags": [
          "WantToRead"
        ],
        "summary": "Given a list of Series Ids, add them to the current logged in user's Want To Read list",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWantToReadDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWantToReadDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWantToReadDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/want-to-read/remove-series": {
      "post": {
        "tags": [
          "WantToRead"
        ],
        "summary": "Given a list of Series Ids, remove them from the current logged in user's Want To Read list",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWantToReadDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWantToReadDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWantToReadDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "AgeRatingDto": {
        "type": "object",
        "properties": {
          "value": {
            "enum": [
              0,
              1,
              2,
              3,
              4,
              5,
              6,
              7,
              8,
              9,
              10,
              11,
              12,
              13,
              14,
              -1
            ],
            "type": "integer",
            "description": "Represents Age Rating for content.",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AgeRestrictionDto": {
        "type": "object",
        "properties": {
          "ageRating": {
            "enum": [
              0,
              1,
              2,
              3,
              4,
              5,
              6,
              7,
              8,
              9,
              10,
              11,
              12,
              13,
              14,
              -1
            ],
            "type": "integer",
            "description": "The maximum age rating a user has access to. -1 if not applicable",
            "format": "int32"
          },
          "includeUnknowns": {
            "type": "boolean",
            "description": "Are Unknowns explicitly allowed against age rating"
          }
        },
        "additionalProperties": false
      },
      "AniListUpdateDto": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AppRole": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "normalizedName": {
            "type": "string",
            "nullable": true
          },
          "concurrencyStamp": {
            "type": "string",
            "nullable": true
          },
          "userRoles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppUserRole"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AppUser": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "userName": {
            "type": "string",
            "nullable": true
          },
          "normalizedUserName": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "normalizedEmail": {
            "type": "string",
            "nullable": true
          },
          "emailConfirmed": {
            "type": "boolean"
          },
          "passwordHash": {
            "type": "string",
            "nullable": true
          },
          "securityStamp": {
            "type": "string",
            "nullable": true
          },
          "concurrencyStamp": {
            "type": "string",
            "nullable": true
          },
          "phoneNumber": {
            "type": "string",
            "nullable": true
          },
          "phoneNumberConfirmed": {
            "type": "boolean"
          },
          "twoFactorEnabled": {
            "type": "boolean"
          },
          "lockoutEnd": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lockoutEnabled": {
            "type": "boolean"
          },
          "accessFailedCount": {
            "type": "integer",
            "format": "int32"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastActive": {
            "type": "string",
            "format": "date-time"
          },
          "lastActiveUtc": {
            "type": "string",
            "format": "date-time"
          },
          "libraries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Library"
            },
            "nullable": true
          },
          "userRoles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppUserRole"
            },
            "nullable": true
          },
          "progresses": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppUserProgress"
            },
            "nullable": true
          },
          "ratings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppUserRating"
            },
            "nullable": true
          },
          "userPreferences": {
            "$ref": "#/components/schemas/AppUserPreferences"
          },
          "bookmarks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppUserBookmark"
            },
            "description": "Bookmarks associated with this User",
            "nullable": true
          },
          "readingLists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ReadingList"
            },
            "description": "Reading lists associated with this user",
            "nullable": true
          },
          "wantToRead": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Series"
            },
            "description": "A list of Series the user want's to read",
            "nullable": true
          },
          "devices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Device"
            },
            "description": "A list of Devices which allows the user to send files to",
            "nullable": true
          },
          "tableOfContents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppUserTableOfContent"
            },
            "description": "A list of Table of Contents for a given Chapter",
            "nullable": true
          },
          "apiKey": {
            "type": "string",
            "description": "An API Key to interact with external services, like OPDS",
            "nullable": true
          },
          "confirmationToken": {
            "type": "string",
            "description": "The confirmation token for the user (invite). This will be set to null after the user confirms.",
            "nullable": true
          },
          "ageRestriction": {
            "enum": [
              0,
              1,
              2,
              3,
              4,
              5,
              6,
              7,
              8,
              9,
              10,
              11,
              12,
              13,
              14,
              -1
            ],
            "type": "integer",
            "description": "The highest age rating the user has access to. Not applicable for admins",
            "format": "int32"
          },
          "ageRestrictionIncludeUnknowns": {
            "type": "boolean",
            "description": "If an age rating restriction is applied to the account, if Unknowns should be allowed for the user. Defaults to false."
          },
          "aniListAccessToken": {
            "type": "string",
            "description": "The JWT for the user's AniList account. Expires after a year.",
            "nullable": true
          },
          "scrobbleHolds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ScrobbleHold"
            },
            "description": "A list of Series the user doesn't want scrobbling for",
            "nullable": true
          },
          "rowVersion": {
            "type": "integer",
            "format": "int32",
            "readOnly": true
          }
        },
        "additionalProperties": false
      },
      "AppUserBookmark": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "page": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "fileName": {
            "type": "string",
            "description": "Filename in the Bookmark Directory",
            "nullable": true
          },
          "appUserId": {
            "type": "integer",
            "format": "int32"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "lastModified": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "Represents a saved page in a Chapter entity for a given user."
      },
      "AppUserPreferences": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "readingDirection": {
            "enum": [
              0,
              1
            ],
            "type": "integer",
            "description": "Manga Reader Option: What direction should the next/prev page buttons go",
            "format": "int32"
          },
          "scalingOption": {
            "enum": [
              0,
              1,
              2,
              3
            ],
            "type": "integer",
            "description": "Manga Reader Option: How should the image be scaled to screen",
            "format": "int32"
          },
          "pageSplitOption": {
            "enum": [
              0,
              1,
              2,
              3
            ],
            "type": "integer",
            "description": "Manga Reader Option: Which side of a split image should we show first",
            "format": "int32"
          },
          "readerMode": {
            "enum": [
              0,
              1,
              2
            ],
            "type": "integer",
            "description": "Manga Reader Option: How the manga reader should perform paging or reading of the file\r\n<example>\r\nWebtoon uses scrolling to page, MANGA_LR uses paging by clicking left/right side of reader, MANGA_UD uses paging\r\nby clicking top/bottom sides of reader.\r\n</example>",
            "format": "int32"
          },
          "autoCloseMenu": {
            "type": "boolean",
            "description": "Manga Reader Option: Allow the menu to close after 6 seconds without interaction"
          },
          "showScreenHints": {
            "type": "boolean",
            "description": "Manga Reader Option: Show screen hints to the user on some actions, ie) pagination direction change"
          },
          "emulateBook": {
            "type": "boolean",
            "description": "Manga Reader Option: Emulate a book by applying a shadow effect on the pages"
          },
          "layoutMode": {
            "enum": [
              1,
              2,
              3
            ],
            "type": "integer",
            "description": "Manga Reader Option: How many pages to display in the reader at once",
            "format": "int32"
          },
          "backgroundColor": {
            "type": "string",
            "description": "Manga Reader Option: Background color of the reader",
            "nullable": true
          },
          "swipeToPaginate": {
            "type": "boolean",
            "description": "Manga Reader Option: Should swiping trigger pagination"
          },
          "bookReaderMargin": {
            "type": "integer",
            "description": "Book Reader Option: Override extra Margin",
            "format": "int32"
          },
          "bookReaderLineSpacing": {
            "type": "integer",
            "description": "Book Reader Option: Override line-height",
            "format": "int32"
          },
          "bookReaderFontSize": {
            "type": "integer",
            "description": "Book Reader Option: Override font size",
            "format": "int32"
          },
          "bookReaderFontFamily": {
            "type": "string",
            "description": "Book Reader Option: Maps to the default Kavita font-family (inherit) or an override",
            "nullable": true
          },
          "bookReaderTapToPaginate": {
            "type": "boolean",
            "description": "Book Reader Option: Allows tapping on side of screens to paginate"
          },
          "bookReaderReadingDirection": {
            "enum": [
              0,
              1
            ],
            "type": "integer",
            "description": "Book Reader Option: What direction should the next/prev page buttons go",
            "format": "int32"
          },
          "bookReaderWritingStyle": {
            "enum": [
              0,
              1
            ],
            "type": "integer",
            "description": "Book Reader Option: Defines the writing styles vertical/horizontal",
            "format": "int32"
          },
          "theme": {
            "$ref": "#/components/schemas/SiteTheme"
          },
          "bookThemeName": {
            "type": "string",
            "description": "Book Reader Option: The color theme to decorate the book contents",
            "nullable": true
          },
          "bookReaderLayoutMode": {
            "enum": [
              0,
              1,
              2
            ],
            "type": "integer",
            "description": "Book Reader Option: The way a page from a book is rendered. Default is as book dictates, 1 column is fit to height,\r\n2 column is fit to height, 2 columns",
            "format": "int32"
          },
          "bookReaderImmersiveMode": {
            "type": "boolean",
            "description": "Book Reader Option: A flag that hides the menu-ing system behind a click on the screen. This should be used with tap to paginate, but the app doesn't enforce this."
          },
          "globalPageLayoutMode": {
            "enum": [
              0,
              1
            ],
            "type": "integer",
            "description": "Global Site Option: If the UI should layout items as Cards or List items",
            "format": "int32"
          },
          "blurUnreadSummaries": {
            "type": "boolean",
            "description": "UI Site Global Setting: If unread summaries should be blurred until expanded or unless user has read it already"
          },
          "promptForDownloadSize": {
            "type": "boolean",
            "description": "UI Site Global Setting: Should Kavita prompt user to confirm downloads that are greater than 100 MB."
          },
          "noTransitions": {
            "type": "boolean",
            "description": "UI Site Global Setting: Should Kavita disable CSS transitions"
          },
          "collapseSeriesRelationships": {
            "type": "boolean",
            "description": "UI Site Global Setting: When showing series, only parent series or series with no relationships will be returned"
          },
          "shareReviews": {
            "type": "boolean",
            "description": "UI Site Global Setting: Should series reviews be shared with all users in the server"
          },
          "locale": {
            "type": "string",
            "description": "UI Site Global Setting: The language locale that should be used for the user",
            "nullable": true
          },
          "appUser": {
            "$ref": "#/components/schemas/AppUser"
          },
          "appUserId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "AppUserProgress": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Id of Entity",
            "format": "int32"
          },
          "pagesRead": {
            "type": "integer",
            "description": "Pages Read for given Chapter",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "description": "Volume belonging to Chapter",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "description": "Series belonging to Chapter",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "description": "Library belonging to Chapter",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "description": "Chapter",
            "format": "int32"
          },
          "bookScrollId": {
            "type": "string",
            "description": "For Book Reader, represents the nearest passed anchor on the screen that can be used to resume scroll point\r\non next load",
            "nullable": true
          },
          "created": {
            "type": "string",
            "description": "When this was first created",
            "format": "date-time"
          },
          "lastModified": {
            "type": "string",
            "description": "Last date this was updated",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "appUser": {
            "$ref": "#/components/schemas/AppUser"
          },
          "appUserId": {
            "type": "integer",
            "description": "User this progress belongs to",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Represents the progress a single user has on a given Chapter."
      },
      "AppUserRating": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "rating": {
            "type": "number",
            "description": "A number between 0-5.0 that represents how good a series is.",
            "format": "float"
          },
          "hasBeenRated": {
            "type": "boolean",
            "description": "If the rating has been explicitly set. Otherwise the 0.0 rating should be ignored as it's not rated"
          },
          "review": {
            "type": "string",
            "description": "A short summary the user can write when giving their review.",
            "nullable": true
          },
          "tagline": {
            "type": "string",
            "description": "An optional tagline for the review",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "series": {
            "$ref": "#/components/schemas/Series"
          },
          "appUserId": {
            "type": "integer",
            "format": "int32"
          },
          "appUser": {
            "$ref": "#/components/schemas/AppUser"
          }
        },
        "additionalProperties": false
      },
      "AppUserRole": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "integer",
            "format": "int32"
          },
          "roleId": {
            "type": "integer",
            "format": "int32"
          },
          "user": {
            "$ref": "#/components/schemas/AppUser"
          },
          "role": {
            "$ref": "#/components/schemas/AppRole"
          }
        },
        "additionalProperties": false
      },
      "AppUserTableOfContent": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "pageNumber": {
            "type": "integer",
            "description": "The page to bookmark",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "description": "The title of the bookmark. Defaults to Page {PageNumber} if not set",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "series": {
            "$ref": "#/components/schemas/Series"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "chapter": {
            "$ref": "#/components/schemas/Chapter"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "bookScrollId": {
            "type": "string",
            "description": "For Book Reader, represents the nearest passed anchor on the screen that can be used to resume scroll point. If empty, the ToC point is the beginning of the page",
            "nullable": true
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastModified": {
            "type": "string",
            "format": "date-time"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "appUser": {
            "$ref": "#/components/schemas/AppUser"
          },
          "appUserId": {
            "type": "integer",
            "description": "User this table of content belongs to",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "A personal table of contents for a given user linked with a given book"
      },
      "BookChapterItem": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "description": "Name of the Chapter",
            "nullable": true
          },
          "part": {
            "type": "string",
            "description": "A part represents the id of the anchor so we can scroll to it. 01_values.xhtml#h_sVZPaxUSy/",
            "nullable": true
          },
          "page": {
            "type": "integer",
            "description": "Page Number to load for the chapter",
            "format": "int32"
          },
          "children": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookChapterItem"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BookInfoDto": {
        "type": "object",
        "properties": {
          "bookTitle": {
            "type": "string",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesFormat": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "description": "Represents the format of the file",
            "format": "int32"
          },
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "chapterNumber": {
            "type": "string",
            "nullable": true
          },
          "volumeNumber": {
            "type": "string",
            "nullable": true
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "pages": {
            "type": "integer",
            "format": "int32"
          },
          "isSpecial": {
            "type": "boolean"
          },
          "chapterTitle": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BookmarkDto": {
        "required": [
          "chapterId",
          "page",
          "seriesId",
          "volumeId"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "page": {
            "type": "integer",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BookmarkInfoDto": {
        "type": "object",
        "properties": {
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "seriesFormat": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "description": "Represents the format of the file",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryType": {
            "enum": [
              0,
              1,
              2
            ],
            "type": "integer",
            "format": "int32"
          },
          "pages": {
            "type": "integer",
            "format": "int32"
          },
          "pageDimensions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FileDimensionDto"
            },
            "description": "List of all files with their inner archive structure maintained in filename and dimensions",
            "nullable": true
          },
          "doublePairs": {
            "type": "object",
            "additionalProperties": {
              "type": "integer",
              "format": "int32"
            },
            "description": "For Double Page reader, this will contain snap points to ensure the reader always resumes on correct page",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BulkRemoveBookmarkForSeriesDto": {
        "type": "object",
        "properties": {
          "seriesIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CblBookResult": {
        "type": "object",
        "properties": {
          "order": {
            "type": "integer",
            "description": "Order in the CBL",
            "format": "int32"
          },
          "series": {
            "type": "string",
            "nullable": true
          },
          "volume": {
            "type": "string",
            "nullable": true
          },
          "number": {
            "type": "string",
            "nullable": true
          },
          "libraryId": {
            "type": "integer",
            "description": "Used on Series conflict",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "description": "Used on Series conflict",
            "format": "int32"
          },
          "readingListName": {
            "type": "string",
            "description": "The name of the reading list",
            "nullable": true
          },
          "reason": {
            "enum": [
              0,
              1,
              2,
              3,
              4,
              5,
              6,
              7,
              8,
              9
            ],
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "CblImportSummaryDto": {
        "type": "object",
        "properties": {
          "cblName": {
            "type": "string",
            "nullable": true
          },
          "fileName": {
            "type": "string",
            "description": "Used only for Kavita's UI, the filename of the cbl",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CblBookResult"
            },
            "nullable": true
          },
          "success": {
            "enum": [
              0,
              1,
              2
            ],
            "type": "integer",
            "format": "int32"
          },
          "successfulInserts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CblBookResult"
            },
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Represents the summary from the Import of a given CBL"
      },
      "Chapter": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "range": {
            "type": "string",
            "description": "Range of numbers. Chapter 2-4 -> \"2-4\". Chapter 2 -> \"2\".",
            "nullable": true
          },
          "number": {
            "type": "string",
            "description": "Smallest number of the Range. Can be a partial like Chapter 4.5",
            "nullable": true
          },
          "files": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MangaFile"
            },
            "description": "The files that represent this Chapter",
            "nullable": true
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "lastModified": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "coverImage": {
            "type": "string",
            "description": "Relative path to the (managed) image file representing the cover image",
            "nullable": true
          },
          "coverImageLocked": {
            "type": "boolean"
          },
          "pages": {
            "type": "integer",
            "description": "Total number of pages in all MangaFiles",
            "format": "int32"
          },
          "isSpecial": {
            "type": "boolean",
            "description": "If this Chapter contains files that could only be identified as Series or has Special Identifier from filename"
          },
          "title": {
            "type": "string",
            "description": "Used for books/specials to display custom title. For non-specials/books, will be set to API.Entities.Chapter.Range",
            "nullable": true
          },
          "ageRating": {
            "enum": [
              0,
              1,
              2,
              3,
              4,
              5,
              6,
              7,
              8,
              9,
              10,
              11,
              12,
              13,
              14,
              -1
            ],
            "type": "integer",
            "description": "Age Rating for the issue/chapter",
            "format": "int32"
          },
          "titleName": {
            "type": "string",
            "description": "Chapter title",
            "nullable": true
          },
          "releaseDate": {
            "type": "string",
            "description": "Date which chapter was released",
            "format": "date-time"
          },
          "summary": {
            "type": "string",
            "description": "Summary for the Chapter/Issue",
            "nullable": true
          },
          "language": {
            "type": "string",
            "description": "Language for the Chapter/Issue",
            "nullable": true
          },
          "totalCount": {
            "type": "integer",
            "description": "Total number of issues or volumes in the series",
            "format": "int32"
          },
          "count": {
            "type": "integer",
            "description": "Number of the Total Count (progress the Series is complete)",
            "format": "int32"
          },
          "seriesGroup": {
            "type": "string",
            "description": "SeriesGroup tag in ComicInfo",
            "nullable": true
          },
          "storyArc": {
            "type": "string",
            "nullable": true
          },
          "storyArcNumber": {
            "type": "string",
            "nullable": true
          },
          "alternateNumber": {
            "type": "string",
            "nullable": true
          },
          "alternateSeries": {
            "type": "string",
            "nullable": true
          },
          "alternateCount": {
            "type": "integer",
            "description": "Not currently used in Kavita",
            "format": "int32"
          },
          "wordCount": {
            "type": "integer",
            "description": "Total Word count of all chapters in this chapter.",
            "format": "int64"
          },
          "minHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "maxHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "avgHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "webLinks": {
            "type": "string",
            "description": "Comma-separated link of urls to external services that have some relation to the Chapter",
            "nullable": true
          },
          "isbn": {
            "type": "string",
            "nullable": true
          },
          "people": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Person"
            },
            "description": "All people attached at a Chapter level. Usually Comics will have different people per issue.",
            "nullable": true
          },
          "genres": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Genre"
            },
            "description": "Genres for the Chapter",
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Tag"
            },
            "nullable": true
          },
          "userProgress": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppUserProgress"
            },
            "nullable": true
          },
          "volume": {
            "$ref": "#/components/schemas/Volume"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ChapterDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "range": {
            "type": "string",
            "description": "Range of chapters. Chapter 2-4 -> \"2-4\". Chapter 2 -> \"2\".",
            "nullable": true
          },
          "number": {
            "type": "string",
            "description": "Smallest number of the Range.",
            "nullable": true
          },
          "pages": {
            "type": "integer",
            "description": "Total number of pages in all MangaFiles",
            "format": "int32"
          },
          "isSpecial": {
            "type": "boolean",
            "description": "If this Chapter contains files that could only be identified as Series or has Special Identifier from filename"
          },
          "title": {
            "type": "string",
            "description": "Used for books/specials to display custom title. For non-specials/books, will be set to API.DTOs.ChapterDto.Range",
            "nullable": true
          },
          "files": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MangaFileDto"
            },
            "description": "The files that represent this Chapter",
            "nullable": true
          },
          "pagesRead": {
            "type": "integer",
            "description": "Calculated at API time. Number of pages read for this Chapter for logged in user.",
            "format": "int32"
          },
          "lastReadingProgressUtc": {
            "type": "string",
            "description": "The last time a chapter was read by current authenticated user",
            "format": "date-time"
          },
          "lastReadingProgress": {
            "type": "string",
            "description": "The last time a chapter was read by current authenticated user",
            "format": "date-time"
          },
          "coverImageLocked": {
            "type": "boolean",
            "description": "If the Cover Image is locked for this entity"
          },
          "volumeId": {
            "type": "integer",
            "description": "Volume Id this Chapter belongs to",
            "format": "int32"
          },
          "createdUtc": {
            "type": "string",
            "description": "When chapter was created",
            "format": "date-time"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "created": {
            "type": "string",
            "description": "When chapter was created in local server time",
            "format": "date-time"
          },
          "releaseDate": {
            "type": "string",
            "description": "When the chapter was released.",
            "format": "date-time"
          },
          "titleName": {
            "type": "string",
            "description": "Title of the Chapter/Issue",
            "nullable": true
          },
          "summary": {
            "type": "string",
            "description": "Summary of the Chapter",
            "nullable": true
          },
          "ageRating": {
            "enum": [
              0,
              1,
              2,
              3,
              4,
              5,
              6,
              7,
              8,
              9,
              10,
              11,
              12,
              13,
              14,
              -1
            ],
            "type": "integer",
            "description": "Age Rating for the issue/chapter",
            "format": "int32"
          },
          "wordCount": {
            "type": "integer",
            "description": "Total words in a Chapter (books only)",
            "format": "int64"
          },
          "volumeTitle": {
            "type": "string",
            "description": "Formatted Volume title ie) Volume 2.",
            "nullable": true
          },
          "minHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "maxHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "avgHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "webLinks": {
            "type": "string",
            "description": "Comma-separated link of urls to external services that have some relation to the Chapter",
            "nullable": true
          },
          "isbn": {
            "type": "string",
            "description": "ISBN-13 (usually) of the Chapter",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "A Chapter is the lowest grouping of a reading medium. A Chapter contains a set of MangaFiles which represents the underlying\r\nfile (abstracted from type)."
      },
      "ChapterInfoDto": {
        "type": "object",
        "properties": {
          "chapterNumber": {
            "type": "string",
            "description": "The Chapter Number",
            "nullable": true
          },
          "volumeNumber": {
            "type": "string",
            "description": "The Volume Number",
            "nullable": true
          },
          "volumeId": {
            "type": "integer",
            "description": "Volume entity Id",
            "format": "int32"
          },
          "seriesName": {
            "type": "string",
            "description": "Series Name",
            "nullable": true
          },
          "seriesFormat": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "description": "Series Format",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "description": "Series entity Id",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "description": "Library entity Id",
            "format": "int32"
          },
          "libraryType": {
            "enum": [
              0,
              1,
              2
            ],
            "type": "integer",
            "description": "Library type",
            "format": "int32"
          },
          "chapterTitle": {
            "type": "string",
            "description": "Chapter's title if set via ComicInfo.xml (Title field)",
            "nullable": true
          },
          "pages": {
            "type": "integer",
            "description": "Total Number of pages in this Chapter",
            "format": "int32"
          },
          "fileName": {
            "type": "string",
            "description": "File name of the chapter",
            "nullable": true
          },
          "isSpecial": {
            "type": "boolean",
            "description": "If this is marked as a special in Kavita"
          },
          "subtitle": {
            "type": "string",
            "description": "The subtitle to render on the reader",
            "nullable": true
          },
          "title": {
            "type": "string",
            "description": "Series Title",
            "nullable": true
          },
          "pageDimensions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FileDimensionDto"
            },
            "description": "List of all files with their inner archive structure maintained in filename and dimensions",
            "nullable": true
          },
          "doublePairs": {
            "type": "object",
            "additionalProperties": {
              "type": "integer",
              "format": "int32"
            },
            "description": "For Double Page reader, this will contain snap points to ensure the reader always resumes on correct page",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Information about the Chapter for the Reader to render"
      },
      "ChapterMetadataDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "writers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "coverArtists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "publishers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "characters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "pencillers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "inkers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "colorists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "letterers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "editors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "translators": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "genres": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GenreTagDto"
            },
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TagDto"
            },
            "description": "Collection of all Tags from underlying chapters for a Series",
            "nullable": true
          },
          "ageRating": {
            "enum": [
              0,
              1,
              2,
              3,
              4,
              5,
              6,
              7,
              8,
              9,
              10,
              11,
              12,
              13,
              14,
              -1
            ],
            "type": "integer",
            "description": "Represents Age Rating for content.",
            "format": "int32"
          },
          "releaseDate": {
            "type": "string",
            "nullable": true
          },
          "publicationStatus": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "format": "int32"
          },
          "summary": {
            "type": "string",
            "description": "Summary for the Chapter/Issue",
            "nullable": true
          },
          "language": {
            "type": "string",
            "description": "Language for the Chapter/Issue",
            "nullable": true
          },
          "count": {
            "type": "integer",
            "description": "Number in the TotalCount of issues",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "description": "Total number of issues for the series",
            "format": "int32"
          },
          "wordCount": {
            "type": "integer",
            "description": "Number of Words for this chapter. Only applies to Epub",
            "format": "int64"
          }
        },
        "additionalProperties": false,
        "description": "Exclusively metadata about a given chapter"
      },
      "CollectionTag": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "description": "Visible title of the Tag",
            "nullable": true
          },
          "coverImage": {
            "type": "string",
            "description": "Absolute path to the (managed) image file",
            "nullable": true
          },
          "coverImageLocked": {
            "type": "boolean",
            "description": "Denotes if the CoverImage has been overridden by the user. If so, it will not be updated during normal scan operations."
          },
          "summary": {
            "type": "string",
            "description": "A description of the tag",
            "nullable": true
          },
          "normalizedTitle": {
            "type": "string",
            "description": "A normalized string used to check if the tag already exists in the DB",
            "nullable": true
          },
          "promoted": {
            "type": "boolean",
            "description": "A promoted collection tag will allow all linked seriesMetadata's Series to show for all users."
          },
          "seriesMetadatas": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesMetadata"
            },
            "nullable": true
          },
          "rowVersion": {
            "type": "integer",
            "description": "Not Used due to not using concurrency update",
            "format": "int32",
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Represents a user entered field that is used as a tagging and grouping mechanism"
      },
      "CollectionTagBulkAddDto": {
        "type": "object",
        "properties": {
          "collectionTagId": {
            "type": "integer",
            "description": "Collection Tag Id",
            "format": "int32"
          },
          "collectionTagTitle": {
            "type": "string",
            "nullable": true
          },
          "seriesIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Series Ids to add onto Collection Tag",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CollectionTagDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "promoted": {
            "type": "boolean"
          },
          "coverImage": {
            "type": "string",
            "description": "The cover image string. This is used on Frontend to show or hide the Cover Image",
            "nullable": true
          },
          "coverImageLocked": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ConfirmEmailDto": {
        "required": [
          "email",
          "password",
          "token",
          "username"
        ],
        "type": "object",
        "properties": {
          "email": {
            "minLength": 1,
            "type": "string"
          },
          "token": {
            "minLength": 1,
            "type": "string"
          },
          "password": {
            "maxLength": 32,
            "minLength": 6,
            "type": "string"
          },
          "username": {
            "minLength": 1,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "ConfirmEmailUpdateDto": {
        "required": [
          "email",
          "token"
        ],
        "type": "object",
        "properties": {
          "email": {
            "minLength": 1,
            "type": "string"
          },
          "token": {
            "minLength": 1,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "ConfirmMigrationEmailDto": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "nullable": true
          },
          "token": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ConfirmPasswordResetDto": {
        "required": [
          "email",
          "password",
          "token"
        ],
        "type": "object",
        "properties": {
          "email": {
            "minLength": 1,
            "type": "string"
          },
          "token": {
            "minLength": 1,
            "type": "string"
          },
          "password": {
            "maxLength": 32,
            "minLength": 6,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "CreateDeviceDto": {
        "required": [
          "emailAddress",
          "name",
          "platform"
        ],
        "type": "object",
        "properties": {
          "name": {
            "minLength": 1,
            "type": "string"
          },
          "platform": {
            "enum": [
              0,
              1,
              2,
              3
            ],
            "type": "integer",
            "description": "Platform of the device. If not know, defaults to \"Custom\"",
            "format": "int32"
          },
          "emailAddress": {
            "minLength": 1,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "CreatePersonalToCDto": {
        "type": "object",
        "properties": {
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "pageNumber": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "bookScrollId": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CreateReadingListDto": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DateTimePagesReadOnADayCount": {
        "type": "object",
        "properties": {
          "value": {
            "type": "string",
            "description": "The day of the readings",
            "format": "date-time"
          },
          "count": {
            "type": "integer",
            "description": "Number of pages read",
            "format": "int64"
          },
          "format": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "description": "Format of those files",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "DayOfWeekStatCount": {
        "type": "object",
        "properties": {
          "value": {
            "enum": [
              0,
              1,
              2,
              3,
              4,
              5,
              6
            ],
            "type": "integer",
            "format": "int32"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "DeleteSeriesDto": {
        "type": "object",
        "properties": {
          "seriesIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Device": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "ipAddress": {
            "type": "string",
            "description": "Last Seen IP Address of the device",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "A name given to this device",
            "nullable": true,
            "example": "Pixel 3a, John's Kindle"
          },
          "emailAddress": {
            "type": "string",
            "description": "An email address associated with the device (ie Kindle). Will be used with Send to functionality",
            "nullable": true
          },
          "platform": {
            "enum": [
              0,
              1,
              2,
              3
            ],
            "type": "integer",
            "description": "Platform (ie) Windows 10",
            "format": "int32"
          },
          "appUserId": {
            "type": "integer",
            "format": "int32"
          },
          "appUser": {
            "$ref": "#/components/schemas/AppUser"
          },
          "lastUsed": {
            "type": "string",
            "description": "Last time this device was used to send a file",
            "format": "date-time"
          },
          "lastUsedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "lastModified": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "A Device is an entity that can receive data from Kavita (kindle)"
      },
      "DeviceDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "The device Id",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "A name given to this device",
            "nullable": true,
            "example": "Pixel 3a, John's Kindle"
          },
          "emailAddress": {
            "type": "string",
            "description": "An email address associated with the device (ie Kindle). Will be used with Send to functionality",
            "nullable": true
          },
          "platform": {
            "enum": [
              0,
              1,
              2,
              3
            ],
            "type": "integer",
            "description": "Platform (ie) Windows 10",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "A Device is an entity that can receive data from Kavita (kindle)"
      },
      "DirectoryDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Name of the directory",
            "nullable": true
          },
          "fullPath": {
            "type": "string",
            "description": "Full Directory Path",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DownloadBookmarkDto": {
        "required": [
          "bookmarks"
        ],
        "type": "object",
        "properties": {
          "bookmarks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookmarkDto"
            }
          }
        },
        "additionalProperties": false
      },
      "EmailTestResultDto": {
        "type": "object",
        "properties": {
          "successful": {
            "type": "boolean"
          },
          "errorMessage": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Represents if Test Email Service URL was successful or not and if any error occured"
      },
      "ExternalSeriesDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "coverUrl": {
            "type": "string",
            "nullable": true
          },
          "url": {
            "type": "string",
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FileDimensionDto": {
        "type": "object",
        "properties": {
          "width": {
            "type": "integer",
            "format": "int32"
          },
          "height": {
            "type": "integer",
            "format": "int32"
          },
          "pageNumber": {
            "type": "integer",
            "format": "int32"
          },
          "fileName": {
            "type": "string",
            "description": "The filename of the cached file. If this was nested in a subfolder, the foldername will be appended with _",
            "nullable": true,
            "example": "chapter01_page01.png"
          },
          "isWide": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "FileExtensionBreakdownDto": {
        "type": "object",
        "properties": {
          "totalFileSize": {
            "type": "integer",
            "description": "Total bytes for all files",
            "format": "int64"
          },
          "fileBreakdown": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FileExtensionDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FileExtensionDto": {
        "type": "object",
        "properties": {
          "extension": {
            "type": "string",
            "nullable": true
          },
          "format": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "description": "Represents the format of the file",
            "format": "int32"
          },
          "totalSize": {
            "type": "integer",
            "format": "int64"
          },
          "totalFiles": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FileFormatDto": {
        "type": "object",
        "properties": {
          "extension": {
            "type": "string",
            "description": "The extension with the ., in lowercase",
            "nullable": true
          },
          "format": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "description": "Format of extension",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "FilterDto": {
        "type": "object",
        "properties": {
          "formats": {
            "type": "array",
            "items": {
              "enum": [
                0,
                1,
                2,
                3,
                4
              ],
              "type": "integer",
              "description": "Represents the format of the file",
              "format": "int32"
            },
            "description": "The type of Formats you want to be returned. An empty list will return all formats back",
            "nullable": true
          },
          "readStatus": {
            "$ref": "#/components/schemas/ReadStatus"
          },
          "libraries": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of library ids to restrict search to. Defaults to all libraries by passing empty list",
            "nullable": true
          },
          "genres": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of Genre ids to restrict search to. Defaults to all genres by passing an empty list",
            "nullable": true
          },
          "writers": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of Writers to restrict search to. Defaults to all Writers by passing an empty list",
            "nullable": true
          },
          "penciller": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of Penciller ids to restrict search to. Defaults to all Pencillers by passing an empty list",
            "nullable": true
          },
          "inker": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of Inker ids to restrict search to. Defaults to all Inkers by passing an empty list",
            "nullable": true
          },
          "colorist": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of Colorist ids to restrict search to. Defaults to all Colorists by passing an empty list",
            "nullable": true
          },
          "letterer": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of Letterer ids to restrict search to. Defaults to all Letterers by passing an empty list",
            "nullable": true
          },
          "coverArtist": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of CoverArtist ids to restrict search to. Defaults to all CoverArtists by passing an empty list",
            "nullable": true
          },
          "editor": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of Editor ids to restrict search to. Defaults to all Editors by passing an empty list",
            "nullable": true
          },
          "publisher": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of Publisher ids to restrict search to. Defaults to all Publishers by passing an empty list",
            "nullable": true
          },
          "character": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of Character ids to restrict search to. Defaults to all Characters by passing an empty list",
            "nullable": true
          },
          "translators": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of Translator ids to restrict search to. Defaults to all Translatorss by passing an empty list",
            "nullable": true
          },
          "collectionTags": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of Collection Tag ids to restrict search to. Defaults to all Collection Tags by passing an empty list",
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of Tag ids to restrict search to. Defaults to all Tags by passing an empty list",
            "nullable": true
          },
          "rating": {
            "type": "integer",
            "description": "Will return back everything with the rating and above\r\nAPI.Entities.AppUserRating.Rating",
            "format": "int32"
          },
          "sortOptions": {
            "$ref": "#/components/schemas/SortOptions"
          },
          "ageRating": {
            "type": "array",
            "items": {
              "enum": [
                0,
                1,
                2,
                3,
                4,
                5,
                6,
                7,
                8,
                9,
                10,
                11,
                12,
                13,
                14,
                -1
              ],
              "type": "integer",
              "description": "Represents Age Rating for content.",
              "format": "int32"
            },
            "description": "Age Ratings. Empty list will return everything back",
            "nullable": true
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Languages (ISO 639-1 code) to filter by. Empty list will return everything back",
            "nullable": true
          },
          "publicationStatus": {
            "type": "array",
            "items": {
              "enum": [
                0,
                1,
                2,
                3,
                4
              ],
              "type": "integer",
              "format": "int32"
            },
            "description": "Publication statuses to filter by. Empty list will return everything back",
            "nullable": true
          },
          "seriesNameQuery": {
            "type": "string",
            "description": "An optional name string to filter by. Empty string will ignore.",
            "nullable": true
          },
          "releaseYearRange": {
            "$ref": "#/components/schemas/Int32Range"
          }
        },
        "additionalProperties": false
      },
      "FolderPath": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "path": {
            "type": "string",
            "nullable": true
          },
          "lastScanned": {
            "type": "string",
            "description": "Used when scanning to see if we can skip if nothing has changed",
            "format": "date-time"
          },
          "library": {
            "$ref": "#/components/schemas/Library"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Genre": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "normalizedTitle": {
            "type": "string",
            "nullable": true
          },
          "seriesMetadatas": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesMetadata"
            },
            "nullable": true
          },
          "chapters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Chapter"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GenreTagDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "HourEstimateRangeDto": {
        "type": "object",
        "properties": {
          "minHours": {
            "type": "integer",
            "description": "Min hours to read the selection",
            "format": "int32"
          },
          "maxHours": {
            "type": "integer",
            "description": "Max hours to read the selection",
            "format": "int32"
          },
          "avgHours": {
            "type": "integer",
            "description": "Estimated average hours to read the selection",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "A range of time to read a selection (series, chapter, etc)"
      },
      "Int32Range": {
        "type": "object",
        "properties": {
          "min": {
            "type": "integer",
            "format": "int32"
          },
          "max": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Represents a range between two int/float/double"
      },
      "Int32StatCount": {
        "type": "object",
        "properties": {
          "value": {
            "type": "integer",
            "format": "int32"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "InviteUserDto": {
        "required": [
          "email"
        ],
        "type": "object",
        "properties": {
          "email": {
            "minLength": 1,
            "type": "string"
          },
          "roles": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "List of Roles to assign to user. If admin not present, Pleb will be applied.\r\nIf admin present, all libraries will be granted access and will ignore those from DTO.",
            "nullable": true
          },
          "libraries": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of libraries to grant access to",
            "nullable": true
          },
          "ageRestriction": {
            "$ref": "#/components/schemas/AgeRestrictionDto"
          }
        },
        "additionalProperties": false
      },
      "JobDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Job Id",
            "nullable": true
          },
          "title": {
            "type": "string",
            "description": "Human Readable title for the Job",
            "nullable": true
          },
          "createdAtUtc": {
            "type": "string",
            "description": "When the job was created",
            "format": "date-time",
            "nullable": true
          },
          "lastExecutionUtc": {
            "type": "string",
            "description": "Last time the job was run",
            "format": "date-time",
            "nullable": true
          },
          "cron": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "JumpKeyDto": {
        "type": "object",
        "properties": {
          "size": {
            "type": "integer",
            "description": "Number of items in this Key",
            "format": "int32"
          },
          "key": {
            "type": "string",
            "description": "Code to use in URL (url encoded)",
            "nullable": true
          },
          "title": {
            "type": "string",
            "description": "What is visible to user",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Represents an individual button in a Jump Bar"
      },
      "LanguageDto": {
        "type": "object",
        "properties": {
          "isoCode": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Library": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "coverImage": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "enum": [
              0,
              1,
              2
            ],
            "type": "integer",
            "format": "int32"
          },
          "folderWatching": {
            "type": "boolean",
            "description": "If Folder Watching is enabled for this library"
          },
          "includeInDashboard": {
            "type": "boolean",
            "description": "Include Library series on Dashboard Streams"
          },
          "includeInRecommended": {
            "type": "boolean",
            "description": "Include Library series on Recommended Streams"
          },
          "includeInSearch": {
            "type": "boolean",
            "description": "Include library series in Search"
          },
          "manageCollections": {
            "type": "boolean",
            "description": "Should this library create collections from Metadata"
          },
          "manageReadingLists": {
            "type": "boolean",
            "description": "Should this library create reading lists from Metadata"
          },
          "allowScrobbling": {
            "type": "boolean",
            "description": "Should this library allow Scrobble events to emit from it"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "lastModified": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastScanned": {
            "type": "string",
            "description": "Last time Library was scanned",
            "format": "date-time"
          },
          "folders": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FolderPath"
            },
            "nullable": true
          },
          "appUsers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppUser"
            },
            "nullable": true
          },
          "series": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Series"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "LibraryDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "lastScanned": {
            "type": "string",
            "description": "Last time Library was scanned",
            "format": "date-time"
          },
          "type": {
            "enum": [
              0,
              1,
              2
            ],
            "type": "integer",
            "format": "int32"
          },
          "coverImage": {
            "type": "string",
            "description": "An optional Cover Image or null",
            "nullable": true
          },
          "folderWatching": {
            "type": "boolean",
            "description": "If Folder Watching is enabled for this library"
          },
          "includeInDashboard": {
            "type": "boolean",
            "description": "Include Library series on Dashboard Streams"
          },
          "includeInRecommended": {
            "type": "boolean",
            "description": "Include Library series on Recommended Streams"
          },
          "manageCollections": {
            "type": "boolean",
            "description": "Should this library create and manage collections from Metadata"
          },
          "manageReadingLists": {
            "type": "boolean",
            "description": "Should this library create and manage reading lists from Metadata"
          },
          "includeInSearch": {
            "type": "boolean",
            "description": "Include library series in Search"
          },
          "allowScrobbling": {
            "type": "boolean",
            "description": "Should this library allow Scrobble events to emit from it"
          },
          "folders": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "collapseSeriesRelationships": {
            "type": "boolean",
            "description": "When showing series, only parent series or series with no relationships will be returned"
          }
        },
        "additionalProperties": false
      },
      "LibraryDtoICount": {
        "type": "object",
        "properties": {
          "value": {
            "$ref": "#/components/schemas/LibraryDto"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "LoginDto": {
        "type": "object",
        "properties": {
          "username": {
            "type": "string",
            "nullable": true
          },
          "password": {
            "type": "string",
            "nullable": true
          },
          "apiKey": {
            "type": "string",
            "description": "If ApiKey is passed, will ignore username/password for validation",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MangaFile": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "filePath": {
            "type": "string",
            "description": "Absolute path to the archive file",
            "nullable": true
          },
          "pages": {
            "type": "integer",
            "description": "Number of pages for the given file",
            "format": "int32"
          },
          "format": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "description": "Represents the format of the file",
            "format": "int32"
          },
          "bytes": {
            "type": "integer",
            "description": "How many bytes make up this file",
            "format": "int64"
          },
          "extension": {
            "type": "string",
            "description": "File extension",
            "nullable": true
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "lastModified": {
            "type": "string",
            "description": "Last time underlying file was modified",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastFileAnalysis": {
            "type": "string",
            "description": "Last time file analysis ran on this file",
            "format": "date-time"
          },
          "lastFileAnalysisUtc": {
            "type": "string",
            "format": "date-time"
          },
          "chapter": {
            "$ref": "#/components/schemas/Chapter"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Represents a wrapper to the underlying file. This provides information around file, like number of pages, format, etc."
      },
      "MangaFileDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "filePath": {
            "type": "string",
            "nullable": true
          },
          "pages": {
            "type": "integer",
            "format": "int32"
          },
          "bytes": {
            "type": "integer",
            "format": "int64"
          },
          "format": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "description": "Represents the format of the file",
            "format": "int32"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "MangaFormatStatCount": {
        "type": "object",
        "properties": {
          "value": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "description": "Represents the format of the file",
            "format": "int32"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "MarkMultipleSeriesAsReadDto": {
        "type": "object",
        "properties": {
          "seriesIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MarkReadDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "MarkVolumeReadDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "MarkVolumesReadDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of Volumes to mark read",
            "nullable": true
          },
          "chapterIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of additional Chapters to mark as read",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "This is used for bulk updating a set of volume and or chapters in one go"
      },
      "MediaErrorDto": {
        "type": "object",
        "properties": {
          "extension": {
            "type": "string",
            "description": "Format Type (RAR, ZIP, 7Zip, Epub, PDF)",
            "nullable": true
          },
          "filePath": {
            "type": "string",
            "description": "Full Filepath to the file that has some issue",
            "nullable": true
          },
          "comment": {
            "type": "string",
            "description": "Developer defined string",
            "nullable": true
          },
          "details": {
            "type": "string",
            "description": "Exception message",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MemberDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "isPending": {
            "type": "boolean",
            "description": "If the member is still pending or not"
          },
          "ageRestriction": {
            "$ref": "#/components/schemas/AgeRestrictionDto"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "lastActive": {
            "type": "string",
            "format": "date-time"
          },
          "libraries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LibraryDto"
            },
            "nullable": true
          },
          "roles": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Represents a member of a Kavita server."
      },
      "MigrateUserEmailDto": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "nullable": true
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "password": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Person": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "normalizedName": {
            "type": "string",
            "nullable": true
          },
          "role": {
            "enum": [
              1,
              3,
              4,
              5,
              6,
              7,
              8,
              9,
              10,
              11,
              12
            ],
            "type": "integer",
            "format": "int32"
          },
          "seriesMetadatas": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesMetadata"
            },
            "nullable": true
          },
          "chapterMetadatas": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Chapter"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PersonDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "role": {
            "enum": [
              1,
              3,
              4,
              5,
              6,
              7,
              8,
              9,
              10,
              11,
              12
            ],
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "PersonalToCDto": {
        "type": "object",
        "properties": {
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "pageNumber": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "bookScrollId": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ProgressDto": {
        "required": [
          "chapterId",
          "libraryId",
          "pageNum",
          "seriesId",
          "volumeId"
        ],
        "type": "object",
        "properties": {
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "pageNum": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "bookScrollId": {
            "type": "string",
            "description": "For EPUB reader, this can be an optional string of the id of a part marker, to help resume reading position\r\non pages that combine multiple \"chapters\".",
            "nullable": true
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "PublicationStatusStatCount": {
        "type": "object",
        "properties": {
          "value": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "format": "int32"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "RatingDto": {
        "type": "object",
        "properties": {
          "averageScore": {
            "type": "integer",
            "format": "int32"
          },
          "favoriteCount": {
            "type": "integer",
            "format": "int32"
          },
          "provider": {
            "enum": [
              0,
              1,
              2
            ],
            "type": "integer",
            "description": "Misleading name but is the source of data (like a review coming from AniList)",
            "format": "int32"
          },
          "providerUrl": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ReadHistoryEvent": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "integer",
            "format": "int32"
          },
          "userName": {
            "type": "string",
            "nullable": true
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "readDate": {
            "type": "string",
            "format": "date-time"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterNumber": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Represents a single User's reading event"
      },
      "ReadStatus": {
        "type": "object",
        "properties": {
          "notRead": {
            "type": "boolean"
          },
          "inProgress": {
            "type": "boolean"
          },
          "read": {
            "type": "boolean"
          }
        },
        "additionalProperties": false,
        "description": "Represents the Reading Status. This is a flag and allows multiple statues"
      },
      "ReadingList": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "normalizedTitle": {
            "type": "string",
            "description": "A normalized string used to check if the reading list already exists in the DB",
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "promoted": {
            "type": "boolean",
            "description": "Reading lists that are promoted are only done by admins"
          },
          "coverImage": {
            "type": "string",
            "description": "Absolute path to the (managed) image file",
            "nullable": true
          },
          "coverImageLocked": {
            "type": "boolean"
          },
          "ageRating": {
            "enum": [
              0,
              1,
              2,
              3,
              4,
              5,
              6,
              7,
              8,
              9,
              10,
              11,
              12,
              13,
              14,
              -1
            ],
            "type": "integer",
            "description": "The highest age rating from all Series within the reading list",
            "format": "int32"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ReadingListItem"
            },
            "nullable": true
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "lastModified": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "startingYear": {
            "type": "integer",
            "description": "Minimum Year the Reading List starts",
            "format": "int32"
          },
          "startingMonth": {
            "type": "integer",
            "description": "Minimum Month the Reading List starts",
            "format": "int32"
          },
          "endingYear": {
            "type": "integer",
            "description": "Maximum Year the Reading List starts",
            "format": "int32"
          },
          "endingMonth": {
            "type": "integer",
            "description": "Maximum Month the Reading List starts",
            "format": "int32"
          },
          "appUserId": {
            "type": "integer",
            "format": "int32"
          },
          "appUser": {
            "$ref": "#/components/schemas/AppUser"
          }
        },
        "additionalProperties": false,
        "description": "This is a collection of API.Entities.ReadingListItem which represent individual chapters and an order."
      },
      "ReadingListDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "promoted": {
            "type": "boolean",
            "description": "Reading lists that are promoted are only done by admins"
          },
          "coverImageLocked": {
            "type": "boolean"
          },
          "coverImage": {
            "type": "string",
            "description": "This is used to tell the UI if it should request a Cover Image or not. If null or empty, it has not been set.",
            "nullable": true
          },
          "startingYear": {
            "type": "integer",
            "description": "Minimum Year the Reading List starts",
            "format": "int32"
          },
          "startingMonth": {
            "type": "integer",
            "description": "Minimum Month the Reading List starts",
            "format": "int32"
          },
          "endingYear": {
            "type": "integer",
            "description": "Maximum Year the Reading List starts",
            "format": "int32"
          },
          "endingMonth": {
            "type": "integer",
            "description": "Maximum Month the Reading List starts",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ReadingListItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "order": {
            "type": "integer",
            "description": "Order of the chapter within a Reading List",
            "format": "int32"
          },
          "readingList": {
            "$ref": "#/components/schemas/ReadingList"
          },
          "readingListId": {
            "type": "integer",
            "format": "int32"
          },
          "series": {
            "$ref": "#/components/schemas/Series"
          },
          "volume": {
            "$ref": "#/components/schemas/Volume"
          },
          "chapter": {
            "$ref": "#/components/schemas/Chapter"
          }
        },
        "additionalProperties": false
      },
      "ReadingListItemDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "order": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "seriesFormat": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "description": "Represents the format of the file",
            "format": "int32"
          },
          "pagesRead": {
            "type": "integer",
            "format": "int32"
          },
          "pagesTotal": {
            "type": "integer",
            "format": "int32"
          },
          "chapterNumber": {
            "type": "string",
            "nullable": true
          },
          "volumeNumber": {
            "type": "string",
            "nullable": true
          },
          "chapterTitleName": {
            "type": "string",
            "nullable": true
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "libraryType": {
            "enum": [
              0,
              1,
              2
            ],
            "type": "integer",
            "format": "int32"
          },
          "libraryName": {
            "type": "string",
            "nullable": true
          },
          "releaseDate": {
            "type": "string",
            "description": "Release Date from Chapter",
            "format": "date-time"
          },
          "readingListId": {
            "type": "integer",
            "description": "Used internally only",
            "format": "int32"
          },
          "lastReadingProgressUtc": {
            "type": "string",
            "description": "The last time a reading list item (underlying chapter) was read by current authenticated user",
            "format": "date-time"
          },
          "fileSize": {
            "type": "integer",
            "description": "File size of underlying item",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "RecentlyAddedItemDto": {
        "type": "object",
        "properties": {
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryType": {
            "enum": [
              0,
              1,
              2
            ],
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "description": "This will automatically map to Volume X, Chapter Y, etc.",
            "nullable": true
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "chapterId": {
            "type": "integer",
            "description": "Chapter Id if this is a chapter. Not guaranteed to be set.",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "description": "Volume Id if this is a chapter. Not guaranteed to be set.",
            "format": "int32"
          },
          "id": {
            "type": "integer",
            "description": "This is used only on the UI. It is just index of being added.",
            "format": "int32"
          },
          "format": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "description": "Represents the format of the file",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "A mesh of data for Recently added volume/chapters"
      },
      "RecommendationDto": {
        "type": "object",
        "properties": {
          "ownedSeries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "externalSeries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExternalSeriesDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RefreshSeriesDto": {
        "type": "object",
        "properties": {
          "libraryId": {
            "type": "integer",
            "description": "Library Id series belongs to",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "description": "Series Id",
            "format": "int32"
          },
          "forceUpdate": {
            "type": "boolean",
            "description": "Should the task force opening/re-calculation."
          }
        },
        "additionalProperties": false,
        "description": "Used for running some task against a Series."
      },
      "RegisterDto": {
        "required": [
          "password",
          "username"
        ],
        "type": "object",
        "properties": {
          "username": {
            "minLength": 1,
            "type": "string"
          },
          "email": {
            "type": "string",
            "description": "An email to register with. Optional. Provides Forgot Password functionality",
            "nullable": true
          },
          "password": {
            "maxLength": 32,
            "minLength": 6,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "RelatedSeriesDto": {
        "type": "object",
        "properties": {
          "sourceSeriesId": {
            "type": "integer",
            "description": "The parent relationship Series",
            "format": "int32"
          },
          "sequels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "prequels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "spinOffs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "adaptations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "sideStories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "characters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "contains": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "others": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "alternativeSettings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "alternativeVersions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "doujinshis": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "parent": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "editions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RemoveBookmarkForSeriesDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ResetPasswordDto": {
        "required": [
          "password",
          "userName"
        ],
        "type": "object",
        "properties": {
          "userName": {
            "minLength": 1,
            "type": "string",
            "description": "The Username of the User"
          },
          "password": {
            "maxLength": 32,
            "minLength": 6,
            "type": "string",
            "description": "The new password"
          },
          "oldPassword": {
            "type": "string",
            "description": "The old, existing password. If an admin is performing the change, this is not required. Otherwise, it is.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ScanFolderDto": {
        "type": "object",
        "properties": {
          "apiKey": {
            "type": "string",
            "description": "Api key for a user with Admin permissions",
            "nullable": true
          },
          "folderPath": {
            "type": "string",
            "description": "Folder Path to Scan",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "DTO for requesting a folder to be scanned"
      },
      "ScrobbleErrorDto": {
        "type": "object",
        "properties": {
          "comment": {
            "type": "string",
            "description": "Developer defined string",
            "nullable": true
          },
          "details": {
            "type": "string",
            "description": "List of providers that could not",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "ScrobbleEventDto": {
        "type": "object",
        "properties": {
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "isProcessed": {
            "type": "boolean"
          },
          "volumeNumber": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "chapterNumber": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "rating": {
            "type": "number",
            "format": "float",
            "nullable": true
          },
          "scrobbleEventType": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ScrobbleEventFilter": {
        "type": "object",
        "properties": {
          "field": {
            "enum": [
              0,
              1,
              2,
              3,
              4,
              5
            ],
            "type": "integer",
            "description": "Which field to sort on",
            "format": "int32"
          },
          "isDescending": {
            "type": "boolean",
            "description": "If the sort should be a descending sort"
          },
          "query": {
            "type": "string",
            "description": "A query to search against",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ScrobbleHold": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "series": {
            "$ref": "#/components/schemas/Series"
          },
          "appUserId": {
            "type": "integer",
            "format": "int32"
          },
          "appUser": {
            "$ref": "#/components/schemas/AppUser"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastModified": {
            "type": "string",
            "format": "date-time"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "ScrobbleHoldDto": {
        "type": "object",
        "properties": {
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "SearchResultDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "originalName": {
            "type": "string",
            "nullable": true
          },
          "sortName": {
            "type": "string",
            "nullable": true
          },
          "localizedName": {
            "type": "string",
            "nullable": true
          },
          "format": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "description": "Represents the format of the file",
            "format": "int32"
          },
          "libraryName": {
            "type": "string",
            "nullable": true
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "SearchResultGroupDto": {
        "type": "object",
        "properties": {
          "libraries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LibraryDto"
            },
            "nullable": true
          },
          "series": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SearchResultDto"
            },
            "nullable": true
          },
          "collections": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CollectionTagDto"
            },
            "nullable": true
          },
          "readingLists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ReadingListDto"
            },
            "nullable": true
          },
          "persons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "genres": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GenreTagDto"
            },
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TagDto"
            },
            "nullable": true
          },
          "files": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MangaFileDto"
            },
            "nullable": true
          },
          "chapters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChapterDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Represents all Search results for a query"
      },
      "SendSeriesToDeviceDto": {
        "type": "object",
        "properties": {
          "deviceId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "SendToDeviceDto": {
        "type": "object",
        "properties": {
          "deviceId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Series": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "The UI visible Name of the Series. This may or may not be the same as the OriginalName",
            "nullable": true
          },
          "normalizedName": {
            "type": "string",
            "description": "Used internally for name matching. M:API.Services.Tasks.Scanner.Parser.Parser.Normalize(System.String)",
            "nullable": true
          },
          "normalizedLocalizedName": {
            "type": "string",
            "description": "Used internally for localized name matching. M:API.Services.Tasks.Scanner.Parser.Parser.Normalize(System.String)",
            "nullable": true
          },
          "sortName": {
            "type": "string",
            "description": "The name used to sort the Series. By default, will be the same as Name.",
            "nullable": true
          },
          "localizedName": {
            "type": "string",
            "description": "Name in original language (Japanese for Manga). By default, will be same as Name.",
            "nullable": true
          },
          "originalName": {
            "type": "string",
            "description": "Original Name on disk. Not exposed to UI.",
            "nullable": true
          },
          "created": {
            "type": "string",
            "description": "Time of creation",
            "format": "date-time"
          },
          "lastModified": {
            "type": "string",
            "description": "Whenever a modification occurs. Ie) New volumes, removed volumes, title update, etc",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "coverImage": {
            "type": "string",
            "description": "Absolute path to the (managed) image file",
            "nullable": true
          },
          "coverImageLocked": {
            "type": "boolean",
            "description": "Denotes if the CoverImage has been overridden by the user. If so, it will not be updated during normal scan operations."
          },
          "pages": {
            "type": "integer",
            "description": "Sum of all Volume page counts",
            "format": "int32"
          },
          "folderPath": {
            "type": "string",
            "description": "Highest path (that is under library root) that contains the series.",
            "nullable": true
          },
          "lastFolderScanned": {
            "type": "string",
            "description": "Last time the folder was scanned",
            "format": "date-time"
          },
          "lastFolderScannedUtc": {
            "type": "string",
            "description": "Last time the folder was scanned in Utc",
            "format": "date-time"
          },
          "format": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "description": "The type of all the files attached to this series",
            "format": "int32"
          },
          "sortNameLocked": {
            "type": "boolean"
          },
          "localizedNameLocked": {
            "type": "boolean"
          },
          "lastChapterAdded": {
            "type": "string",
            "description": "When a Chapter was last added onto the Series",
            "format": "date-time"
          },
          "lastChapterAddedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "wordCount": {
            "type": "integer",
            "description": "Total Word count of all chapters in this chapter.",
            "format": "int64"
          },
          "minHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "maxHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "avgHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "metadata": {
            "$ref": "#/components/schemas/SeriesMetadata"
          },
          "ratings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppUserRating"
            },
            "nullable": true
          },
          "progress": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppUserProgress"
            },
            "nullable": true
          },
          "relations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesRelation"
            },
            "description": "Relations to other Series, like Sequels, Prequels, etc",
            "nullable": true
          },
          "relationOf": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesRelation"
            },
            "nullable": true
          },
          "volumes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Volume"
            },
            "nullable": true
          },
          "library": {
            "$ref": "#/components/schemas/Library"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "SeriesByIdsDto": {
        "type": "object",
        "properties": {
          "seriesIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SeriesDetailDto": {
        "type": "object",
        "properties": {
          "specials": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChapterDto"
            },
            "description": "Specials for the Series. These will have their title and range cleaned to remove the special marker and prepare",
            "nullable": true
          },
          "chapters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChapterDto"
            },
            "description": "All Chapters, excluding Specials and single chapters (0 chapter) for a volume",
            "nullable": true
          },
          "volumes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VolumeDto"
            },
            "description": "Just the Volumes for the Series (Excludes Volume 0)",
            "nullable": true
          },
          "storylineChapters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChapterDto"
            },
            "description": "These are chapters that are in Volume 0 and should be read AFTER the volumes",
            "nullable": true
          },
          "unreadCount": {
            "type": "integer",
            "description": "How many chapters are unread",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "description": "How many chapters are there",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "This is a special DTO for a UI page in Kavita. This performs sorting and grouping and returns exactly what UI requires for layout.\r\nThis is subject to change, do not rely on this Data model."
      },
      "SeriesDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "originalName": {
            "type": "string",
            "nullable": true
          },
          "localizedName": {
            "type": "string",
            "nullable": true
          },
          "sortName": {
            "type": "string",
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "pages": {
            "type": "integer",
            "format": "int32"
          },
          "coverImageLocked": {
            "type": "boolean"
          },
          "pagesRead": {
            "type": "integer",
            "description": "Sum of pages read from linked Volumes. Calculated at API-time.",
            "format": "int32"
          },
          "latestReadDate": {
            "type": "string",
            "description": "DateTime representing last time the series was Read. Calculated at API-time.",
            "format": "date-time"
          },
          "lastChapterAdded": {
            "type": "string",
            "description": "DateTime representing last time a chapter was added to the Series",
            "format": "date-time"
          },
          "userRating": {
            "type": "number",
            "description": "Rating from logged in user. Calculated at API-time.",
            "format": "float"
          },
          "hasUserRated": {
            "type": "boolean",
            "description": "If the user has set the rating or not"
          },
          "format": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "description": "Represents the format of the file",
            "format": "int32"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "nameLocked": {
            "type": "boolean"
          },
          "sortNameLocked": {
            "type": "boolean"
          },
          "localizedNameLocked": {
            "type": "boolean"
          },
          "wordCount": {
            "type": "integer",
            "description": "Total number of words for the series. Only applies to epubs.",
            "format": "int64"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryName": {
            "type": "string",
            "nullable": true
          },
          "minHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "maxHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "avgHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "folderPath": {
            "type": "string",
            "description": "The highest level folder for this Series",
            "nullable": true
          },
          "lastFolderScanned": {
            "type": "string",
            "description": "The last time the folder for this series was scanned",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "SeriesDtoICount": {
        "type": "object",
        "properties": {
          "value": {
            "$ref": "#/components/schemas/SeriesDto"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "SeriesMetadata": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "collectionTags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CollectionTag"
            },
            "nullable": true
          },
          "genres": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Genre"
            },
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Tag"
            },
            "nullable": true
          },
          "people": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Person"
            },
            "description": "All people attached at a Series level.",
            "nullable": true
          },
          "ageRating": {
            "enum": [
              0,
              1,
              2,
              3,
              4,
              5,
              6,
              7,
              8,
              9,
              10,
              11,
              12,
              13,
              14,
              -1
            ],
            "type": "integer",
            "description": "Highest Age Rating from all Chapters",
            "format": "int32"
          },
          "releaseYear": {
            "type": "integer",
            "description": "Earliest Year from all chapters",
            "format": "int32"
          },
          "language": {
            "type": "string",
            "description": "Language of the content (BCP-47 code)",
            "nullable": true
          },
          "totalCount": {
            "type": "integer",
            "description": "Total number of issues/volumes in the series",
            "format": "int32"
          },
          "maxCount": {
            "type": "integer",
            "description": "Max number of issues/volumes in the series (Max of Volume/Number field in ComicInfo)",
            "format": "int32"
          },
          "publicationStatus": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "format": "int32"
          },
          "webLinks": {
            "type": "string",
            "description": "A Comma-separated list of strings representing links from the series",
            "nullable": true
          },
          "languageLocked": {
            "type": "boolean"
          },
          "summaryLocked": {
            "type": "boolean"
          },
          "ageRatingLocked": {
            "type": "boolean",
            "description": "Locked by user so metadata updates from scan loop will not override AgeRating"
          },
          "publicationStatusLocked": {
            "type": "boolean",
            "description": "Locked by user so metadata updates from scan loop will not override PublicationStatus"
          },
          "genresLocked": {
            "type": "boolean"
          },
          "tagsLocked": {
            "type": "boolean"
          },
          "writerLocked": {
            "type": "boolean"
          },
          "characterLocked": {
            "type": "boolean"
          },
          "coloristLocked": {
            "type": "boolean"
          },
          "editorLocked": {
            "type": "boolean"
          },
          "inkerLocked": {
            "type": "boolean"
          },
          "lettererLocked": {
            "type": "boolean"
          },
          "pencillerLocked": {
            "type": "boolean"
          },
          "publisherLocked": {
            "type": "boolean"
          },
          "translatorLocked": {
            "type": "boolean"
          },
          "coverArtistLocked": {
            "type": "boolean"
          },
          "releaseYearLocked": {
            "type": "boolean"
          },
          "series": {
            "$ref": "#/components/schemas/Series"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "rowVersion": {
            "type": "integer",
            "format": "int32",
            "readOnly": true
          }
        },
        "additionalProperties": false
      },
      "SeriesMetadataDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "collectionTags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CollectionTagDto"
            },
            "description": "Collections the Series belongs to",
            "nullable": true
          },
          "genres": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GenreTagDto"
            },
            "description": "Genres for the Series",
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TagDto"
            },
            "description": "Collection of all Tags from underlying chapters for a Series",
            "nullable": true
          },
          "writers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "coverArtists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "publishers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "characters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "pencillers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "inkers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "colorists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "letterers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "editors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "translators": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "ageRating": {
            "enum": [
              0,
              1,
              2,
              3,
              4,
              5,
              6,
              7,
              8,
              9,
              10,
              11,
              12,
              13,
              14,
              -1
            ],
            "type": "integer",
            "description": "Highest Age Rating from all Chapters",
            "format": "int32"
          },
          "releaseYear": {
            "type": "integer",
            "description": "Earliest Year from all chapters",
            "format": "int32"
          },
          "language": {
            "type": "string",
            "description": "Language of the content (BCP-47 code)",
            "nullable": true
          },
          "maxCount": {
            "type": "integer",
            "description": "Max number of issues/volumes in the series (Max of Volume/Issue field in ComicInfo)",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "description": "Total number of issues/volumes for the series",
            "format": "int32"
          },
          "publicationStatus": {
            "enum": [
              0,
              1,
              2,
              3,
              4
            ],
            "type": "integer",
            "description": "Publication status of the Series",
            "format": "int32"
          },
          "webLinks": {
            "type": "string",
            "description": "A comma-separated list of Urls",
            "nullable": true
          },
          "languageLocked": {
            "type": "boolean"
          },
          "summaryLocked": {
            "type": "boolean"
          },
          "ageRatingLocked": {
            "type": "boolean",
            "description": "Locked by user so metadata updates from scan loop will not override AgeRating"
          },
          "publicationStatusLocked": {
            "type": "boolean",
            "description": "Locked by user so metadata updates from scan loop will not override PublicationStatus"
          },
          "genresLocked": {
            "type": "boolean"
          },
          "tagsLocked": {
            "type": "boolean"
          },
          "writersLocked": {
            "type": "boolean"
          },
          "charactersLocked": {
            "type": "boolean"
          },
          "coloristsLocked": {
            "type": "boolean"
          },
          "editorsLocked": {
            "type": "boolean"
          },
          "inkersLocked": {
            "type": "boolean"
          },
          "letterersLocked": {
            "type": "boolean"
          },
          "pencillersLocked": {
            "type": "boolean"
          },
          "publishersLocked": {
            "type": "boolean"
          },
          "translatorsLocked": {
            "type": "boolean"
          },
          "coverArtistsLocked": {
            "type": "boolean"
          },
          "releaseYearLocked": {
            "type": "boolean"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "SeriesRelation": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "relationKind": {
            "enum": [
              1,
              2,
              3,
              4,
              5,
              6,
              7,
              8,
              9,
              10,
              11,
              12,
              13
            ],
            "type": "integer",
            "description": "Represents a relationship between Series",
            "format": "int32"
          },
          "targetSeries": {
            "$ref": "#/components/schemas/Series"
          },
          "targetSeriesId": {
            "type": "integer",
            "description": "A is Sequel to B. In this example, TargetSeries is A. B will hold the foreign key.",
            "format": "int32"
          },
          "series": {
            "$ref": "#/components/schemas/Series"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "A relation flows between one series and another.\r\nSeries ---kind---> target"
      },
      "ServerInfoDto": {
        "type": "object",
        "properties": {
          "installId": {
            "type": "string",
            "description": "Unique Id that represents a unique install",
            "nullable": true
          },
          "os": {
            "type": "string",
            "nullable": true
          },
          "isDocker": {
            "type": "boolean",
            "description": "If the Kavita install is using Docker"
          },
          "dotnetVersion": {
            "type": "string",
            "description": "Version of .NET instance is running",
            "nullable": true
          },
          "kavitaVersion": {
            "type": "string",
            "description": "Version of Kavita",
            "nullable": true
          },
          "numOfCores": {
            "type": "integer",
            "description": "Number of Cores on the instance",
            "format": "int32"
          },
          "numberOfLibraries": {
            "type": "integer",
            "description": "The number of libraries on the instance",
            "format": "int32"
          },
          "hasBookmarks": {
            "type": "boolean",
            "description": "Does any user have bookmarks"
          },
          "activeSiteTheme": {
            "type": "string",
            "description": "The site theme the install is using",
            "nullable": true
          },
          "mangaReaderMode": {
            "enum": [
              0,
              1,
              2
            ],
            "type": "integer",
            "description": "The reading mode the main user has as a preference",
            "format": "int32"
          },
          "numberOfUsers": {
            "type": "integer",
            "description": "Number of users on the install",
            "format": "int32"
          },
          "numberOfCollections": {
            "type": "integer",
            "description": "Number of collections on the install",
            "format": "int32"
          },
          "numberOfReadingLists": {
            "type": "integer",
            "description": "Number of reading lists on the install (Sum of all users)",
            "format": "int32"
          },
          "opdsEnabled": {
            "type": "boolean",
            "description": "Is OPDS enabled"
          },
          "totalFiles": {
            "type": "integer",
            "description": "Total number of files in the instance",
            "format": "int32"
          },
          "totalGenres": {
            "type": "integer",
            "description": "Total number of Genres in the instance",
            "format": "int32"
          },
          "totalPeople": {
            "type": "integer",
            "description": "Total number of People in the instance",
            "format": "int32"
          },
          "usersOnCardLayout": {
            "type": "integer",
            "description": "Number of users on this instance using Card Layout",
            "format": "int32"
          },
          "usersOnListLayout": {
            "type": "integer",
            "description": "Number of users on this instance using List Layout",
            "format": "int32"
          },
          "maxSeriesInALibrary": {
            "type": "integer",
            "description": "Max number of Series for any library on the instance",
            "format": "int32"
          },
          "maxVolumesInASeries": {
            "type": "integer",
            "description": "Max number of Volumes for any library on the instance",
            "format": "int32"
          },
          "maxChaptersInASeries": {
            "type": "integer",
            "description": "Max number of Chapters for any library on the instance",
            "format": "int32"
          },
          "usingSeriesRelationships": {
            "type": "boolean",
            "description": "Does this instance have relationships setup between series"
          },
          "mangaReaderBackgroundColors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "A list of background colors set on the instance",
            "nullable": true
          },
          "mangaReaderPageSplittingModes": {
            "type": "array",
            "items": {
              "enum": [
                0,
                1,
                2,
                3
              ],
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of Page Split defaults being used on the instance",
            "nullable": true
          },
          "mangaReaderLayoutModes": {
            "type": "array",
            "items": {
              "enum": [
                1,
                2,
                3
              ],
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of Layout Mode defaults being used on the instance",
            "nullable": true
          },
          "fileFormats": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FileFormatDto"
            },
            "description": "A list of file formats existing in the instance",
            "nullable": true
          },
          "usingRestrictedProfiles": {
            "type": "boolean",
            "description": "If there is at least one user that is using an age restricted profile on the instance"
          },
          "usersWithEmulateComicBook": {
            "type": "integer",
            "description": "Number of users using the Emulate Comic Book setting",
            "format": "int32"
          },
          "percentOfLibrariesWithFolderWatchingEnabled": {
            "type": "number",
            "description": "Percent (0.0-1.0) of libraries with folder watching enabled",
            "format": "float"
          },
          "percentOfLibrariesIncludedInSearch": {
            "type": "number",
            "description": "Percent (0.0-1.0) of libraries included in Search",
            "format": "float"
          },
          "percentOfLibrariesIncludedInRecommended": {
            "type": "number",
            "description": "Percent (0.0-1.0) of libraries included in Recommended",
            "format": "float"
          },
          "percentOfLibrariesIncludedInDashboard": {
            "type": "number",
            "description": "Percent (0.0-1.0) of libraries included in Dashboard",
            "format": "float"
          },
          "totalReadingHours": {
            "type": "integer",
            "description": "Total reading hours of all users",
            "format": "int64"
          },
          "encodeMediaAs": {
            "enum": [
              0,
              1,
              2
            ],
            "type": "integer",
            "description": "The encoding the server is using to save media",
            "format": "int32"
          },
          "lastReadTime": {
            "type": "string",
            "description": "The last user reading progress on the server (in UTC)",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "Represents information about a Kavita Installation"
      },
      "ServerSettingDto": {
        "type": "object",
        "properties": {
          "cacheDirectory": {
            "type": "string",
            "nullable": true
          },
          "taskScan": {
            "type": "string",
            "nullable": true
          },
          "loggingLevel": {
            "type": "string",
            "description": "Logging level for server. Managed in appsettings.json.",
            "nullable": true
          },
          "taskBackup": {
            "type": "string",
            "nullable": true
          },
          "port": {
            "type": "integer",
            "description": "Port the server listens on. Managed in appsettings.json.",
            "format": "int32"
          },
          "ipAddresses": {
            "type": "string",
            "description": "Comma separated list of ip addresses the server listens on. Managed in appsettings.json",
            "nullable": true
          },
          "allowStatCollection": {
            "type": "boolean",
            "description": "Allows anonymous information to be collected and sent to KavitaStats"
          },
          "enableOpds": {
            "type": "boolean",
            "description": "Enables OPDS connections to be made to the server."
          },
          "baseUrl": {
            "type": "string",
            "description": "Base Url for the kavita. Requires restart to take effect.",
            "nullable": true
          },
          "bookmarksDirectory": {
            "type": "string",
            "description": "Where Bookmarks are stored.",
            "nullable": true
          },
          "emailServiceUrl": {
            "type": "string",
            "description": "Email service to use for the invite user flow, forgot password, etc.",
            "nullable": true
          },
          "installVersion": {
            "type": "string",
            "nullable": true
          },
          "installId": {
            "type": "string",
            "description": "Represents a unique Id to this Kavita installation. Only used in Stats to identify unique installs.",
            "nullable": true
          },
          "encodeMediaAs": {
            "enum": [
              0,
              1,
              2
            ],
            "type": "integer",
            "description": "The format that should be used when saving media for Kavita",
            "format": "int32"
          },
          "totalBackups": {
            "type": "integer",
            "description": "The amount of Backups before cleanup",
            "format": "int32"
          },
          "enableFolderWatching": {
            "type": "boolean",
            "description": "If Kavita should watch the library folders and process changes"
          },
          "totalLogs": {
            "type": "integer",
            "description": "Total number of days worth of logs to keep at a given time.",
            "format": "int32"
          },
          "hostName": {
            "type": "string",
            "description": "The Host name (ie Reverse proxy domain name) for the server",
            "nullable": true
          },
          "cacheSize": {
            "type": "integer",
            "description": "The size in MB for Caching API data",
            "format": "int64"
          },
          "onDeckProgressDays": {
            "type": "integer",
            "description": "How many Days since today in the past for reading progress, should content be considered for On Deck, before it gets removed automatically",
            "format": "int32"
          },
          "onDeckUpdateDays": {
            "type": "integer",
            "description": "How many Days since today in the past for chapter updates, should content be considered for On Deck, before it gets removed automatically",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ServerStatisticsDto": {
        "type": "object",
        "properties": {
          "chapterCount": {
            "type": "integer",
            "format": "int64"
          },
          "volumeCount": {
            "type": "integer",
            "format": "int64"
          },
          "seriesCount": {
            "type": "integer",
            "format": "int64"
          },
          "totalFiles": {
            "type": "integer",
            "format": "int64"
          },
          "totalSize": {
            "type": "integer",
            "format": "int64"
          },
          "totalGenres": {
            "type": "integer",
            "format": "int64"
          },
          "totalTags": {
            "type": "integer",
            "format": "int64"
          },
          "totalPeople": {
            "type": "integer",
            "format": "int64"
          },
          "totalReadingTime": {
            "type": "integer",
            "format": "int64"
          },
          "mostReadSeries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDtoICount"
            },
            "nullable": true
          },
          "mostPopularSeries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDtoICount"
            },
            "description": "Total users who have started/reading/read per series",
            "nullable": true
          },
          "mostActiveUsers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UserDtoICount"
            },
            "nullable": true
          },
          "mostActiveLibraries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LibraryDtoICount"
            },
            "nullable": true
          },
          "recentlyRead": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "description": "Last 5 Series read",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SingleStatCount": {
        "type": "object",
        "properties": {
          "value": {
            "type": "number",
            "format": "float"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "SiteTheme": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Name of the Theme",
            "nullable": true
          },
          "normalizedName": {
            "type": "string",
            "description": "Normalized name for lookups",
            "nullable": true
          },
          "fileName": {
            "type": "string",
            "description": "File path to the content. Stored under API.Services.DirectoryService.SiteThemeDirectory.\r\nMust be a .css file",
            "nullable": true
          },
          "isDefault": {
            "type": "boolean",
            "description": "Only one theme can have this. Will auto-set this as default for new user accounts"
          },
          "provider": {
            "enum": [
              1,
              2
            ],
            "type": "integer",
            "description": "Where did the theme come from",
            "format": "int32"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "lastModified": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "Represents a set of css overrides the user can upload to Kavita and will load into webui"
      },
      "SiteThemeDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Name of the Theme",
            "nullable": true
          },
          "normalizedName": {
            "type": "string",
            "description": "Normalized name for lookups",
            "nullable": true
          },
          "fileName": {
            "type": "string",
            "description": "File path to the content. Stored under API.Services.DirectoryService.SiteThemeDirectory.\r\nMust be a .css file",
            "nullable": true
          },
          "isDefault": {
            "type": "boolean",
            "description": "Only one theme can have this. Will auto-set this as default for new user accounts"
          },
          "provider": {
            "enum": [
              1,
              2
            ],
            "type": "integer",
            "description": "Where did the theme come from",
            "format": "int32"
          },
          "selector": {
            "type": "string",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Represents a set of css overrides the user can upload to Kavita and will load into webui"
      },
      "SortOptions": {
        "type": "object",
        "properties": {
          "sortField": {
            "enum": [
              1,
              2,
              3,
              4,
              5,
              6
            ],
            "type": "integer",
            "format": "int32"
          },
          "isAscending": {
            "type": "boolean"
          }
        },
        "additionalProperties": false,
        "description": "Sorting Options for a query"
      },
      "Tag": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "normalizedTitle": {
            "type": "string",
            "nullable": true
          },
          "seriesMetadatas": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesMetadata"
            },
            "nullable": true
          },
          "chapters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Chapter"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TagDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TestEmailDto": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TokenRequestDto": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "nullable": true
          },
          "refreshToken": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TopReadDto": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "integer",
            "format": "int32"
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "comicsTime": {
            "type": "integer",
            "description": "Amount of time read on Comic libraries",
            "format": "int64"
          },
          "booksTime": {
            "type": "integer",
            "description": "Amount of time read on",
            "format": "int64"
          },
          "mangaTime": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "UpdateAgeRestrictionDto": {
        "required": [
          "ageRating",
          "includeUnknowns"
        ],
        "type": "object",
        "properties": {
          "ageRating": {
            "enum": [
              0,
              1,
              2,
              3,
              4,
              5,
              6,
              7,
              8,
              9,
              10,
              11,
              12,
              13,
              14,
              -1
            ],
            "type": "integer",
            "description": "Represents Age Rating for content.",
            "format": "int32"
          },
          "includeUnknowns": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "UpdateDefaultThemeDto": {
        "type": "object",
        "properties": {
          "themeId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "UpdateDeviceDto": {
        "required": [
          "emailAddress",
          "id",
          "name",
          "platform"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "minLength": 1,
            "type": "string"
          },
          "platform": {
            "enum": [
              0,
              1,
              2,
              3
            ],
            "type": "integer",
            "description": "Platform of the device. If not know, defaults to \"Custom\"",
            "format": "int32"
          },
          "emailAddress": {
            "minLength": 1,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "UpdateEmailDto": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "nullable": true
          },
          "password": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateLibraryDto": {
        "required": [
          "allowScrobbling",
          "folders",
          "folderWatching",
          "id",
          "includeInDashboard",
          "includeInRecommended",
          "includeInSearch",
          "manageCollections",
          "manageReadingLists",
          "name",
          "type"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "minLength": 1,
            "type": "string"
          },
          "type": {
            "enum": [
              0,
              1,
              2
            ],
            "type": "integer",
            "format": "int32"
          },
          "folders": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "folderWatching": {
            "type": "boolean"
          },
          "includeInDashboard": {
            "type": "boolean"
          },
          "includeInRecommended": {
            "type": "boolean"
          },
          "includeInSearch": {
            "type": "boolean"
          },
          "manageCollections": {
            "type": "boolean"
          },
          "manageReadingLists": {
            "type": "boolean"
          },
          "allowScrobbling": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "UpdateLibraryForUserDto": {
        "type": "object",
        "properties": {
          "username": {
            "type": "string",
            "nullable": true
          },
          "selectedLibraries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LibraryDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateLicenseDto": {
        "type": "object",
        "properties": {
          "license": {
            "type": "string",
            "description": "License Key received from Kavita+",
            "nullable": true
          },
          "email": {
            "type": "string",
            "description": "Email registered with Stripe",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateNotificationDto": {
        "type": "object",
        "properties": {
          "currentVersion": {
            "type": "string",
            "description": "Current installed Version",
            "nullable": true
          },
          "updateVersion": {
            "type": "string",
            "description": "Semver of the release version\r\n<example>0.4.3</example>",
            "nullable": true
          },
          "updateBody": {
            "type": "string",
            "description": "Release body in HTML",
            "nullable": true
          },
          "updateTitle": {
            "type": "string",
            "description": "Title of the release",
            "nullable": true
          },
          "updateUrl": {
            "type": "string",
            "description": "Github Url",
            "nullable": true
          },
          "isDocker": {
            "type": "boolean",
            "description": "If this install is within Docker"
          },
          "isPrerelease": {
            "type": "boolean",
            "description": "Is this a pre-release"
          },
          "publishDate": {
            "type": "string",
            "description": "Date of the publish",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Update Notification denoting a new release available for user to update to"
      },
      "UpdateReadingListByChapterDto": {
        "type": "object",
        "properties": {
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "readingListId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "UpdateReadingListByMultipleDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "readingListId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "chapterIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateReadingListByMultipleSeriesDto": {
        "type": "object",
        "properties": {
          "readingListId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateReadingListBySeriesDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "readingListId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "UpdateReadingListByVolumeDto": {
        "type": "object",
        "properties": {
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "readingListId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "UpdateReadingListDto": {
        "required": [
          "readingListId"
        ],
        "type": "object",
        "properties": {
          "readingListId": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "promoted": {
            "type": "boolean"
          },
          "coverImageLocked": {
            "type": "boolean"
          },
          "startingMonth": {
            "type": "integer",
            "format": "int32"
          },
          "startingYear": {
            "type": "integer",
            "format": "int32"
          },
          "endingMonth": {
            "type": "integer",
            "format": "int32"
          },
          "endingYear": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "UpdateReadingListPosition": {
        "required": [
          "readingListId",
          "readingListItemId",
          "toPosition"
        ],
        "type": "object",
        "properties": {
          "readingListId": {
            "type": "integer",
            "format": "int32"
          },
          "readingListItemId": {
            "type": "integer",
            "format": "int32"
          },
          "fromPosition": {
            "type": "integer",
            "format": "int32"
          },
          "toPosition": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "DTO for moving a reading list item to another position within the same list"
      },
      "UpdateRelatedSeriesDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "adaptations": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "characters": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "contains": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "others": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "prequels": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "sequels": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "sideStories": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "spinOffs": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "alternativeSettings": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "alternativeVersions": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "doujinshis": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "editions": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateSeriesDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "localizedName": {
            "type": "string",
            "nullable": true
          },
          "sortName": {
            "type": "string",
            "nullable": true
          },
          "coverImageLocked": {
            "type": "boolean"
          },
          "sortNameLocked": {
            "type": "boolean"
          },
          "localizedNameLocked": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "UpdateSeriesForTagDto": {
        "type": "object",
        "properties": {
          "tag": {
            "$ref": "#/components/schemas/CollectionTagDto"
          },
          "seriesIdsToRemove": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateSeriesMetadataDto": {
        "type": "object",
        "properties": {
          "seriesMetadata": {
            "$ref": "#/components/schemas/SeriesMetadataDto"
          },
          "collectionTags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CollectionTagDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateSeriesRatingDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "userRating": {
            "type": "number",
            "format": "float"
          }
        },
        "additionalProperties": false
      },
      "UpdateUserDto": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "integer",
            "format": "int32"
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "roles": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "libraries": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "A list of libraries to grant access to",
            "nullable": true
          },
          "ageRestriction": {
            "$ref": "#/components/schemas/AgeRestrictionDto"
          }
        },
        "additionalProperties": false
      },
      "UpdateUserReviewDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "tagline": {
            "maxLength": 120,
            "type": "string",
            "nullable": true
          },
          "body": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateWantToReadDto": {
        "type": "object",
        "properties": {
          "seriesIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "List of Series Ids that will be Added/Removed",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "A list of Series to pass when working with Want To Read APIs"
      },
      "UploadFileDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Id of the Entity",
            "format": "int32"
          },
          "url": {
            "type": "string",
            "description": "Base Url encoding of the file to upload from (can be null)",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UploadUrlDto": {
        "required": [
          "url"
        ],
        "type": "object",
        "properties": {
          "url": {
            "minLength": 1,
            "type": "string",
            "description": "External url"
          }
        },
        "additionalProperties": false
      },
      "UserDto": {
        "type": "object",
        "properties": {
          "username": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "token": {
            "type": "string",
            "nullable": true
          },
          "refreshToken": {
            "type": "string",
            "nullable": true
          },
          "apiKey": {
            "type": "string",
            "nullable": true
          },
          "preferences": {
            "$ref": "#/components/schemas/UserPreferencesDto"
          },
          "ageRestriction": {
            "$ref": "#/components/schemas/AgeRestrictionDto"
          },
          "kavitaVersion": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UserDtoICount": {
        "type": "object",
        "properties": {
          "value": {
            "$ref": "#/components/schemas/UserDto"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "UserPreferencesDto": {
        "required": [
          "autoCloseMenu",
          "backgroundColor",
          "blurUnreadSummaries",
          "bookReaderFontFamily",
          "bookReaderFontSize",
          "bookReaderImmersiveMode",
          "bookReaderLayoutMode",
          "bookReaderLineSpacing",
          "bookReaderMargin",
          "bookReaderReadingDirection",
          "bookReaderTapToPaginate",
          "bookReaderThemeName",
          "bookReaderWritingStyle",
          "collapseSeriesRelationships",
          "emulateBook",
          "globalPageLayoutMode",
          "layoutMode",
          "locale",
          "noTransitions",
          "pageSplitOption",
          "promptForDownloadSize",
          "readerMode",
          "readingDirection",
          "scalingOption",
          "shareReviews",
          "showScreenHints",
          "swipeToPaginate",
          "theme"
        ],
        "type": "object",
        "properties": {
          "readingDirection": {
            "enum": [
              0,
              1
            ],
            "type": "integer",
            "description": "Manga Reader Option: What direction should the next/prev page buttons go",
            "format": "int32"
          },
          "scalingOption": {
            "enum": [
              0,
              1,
              2,
              3
            ],
            "type": "integer",
            "description": "Manga Reader Option: How should the image be scaled to screen",
            "format": "int32"
          },
          "pageSplitOption": {
            "enum": [
              0,
              1,
              2,
              3
            ],
            "type": "integer",
            "description": "Manga Reader Option: Which side of a split image should we show first",
            "format": "int32"
          },
          "readerMode": {
            "enum": [
              0,
              1,
              2
            ],
            "type": "integer",
            "description": "Manga Reader Option: How the manga reader should perform paging or reading of the file\r\n<example>\r\nWebtoon uses scrolling to page, LeftRight uses paging by clicking left/right side of reader, UpDown uses paging\r\nby clicking top/bottom sides of reader.\r\n</example>",
            "format": "int32"
          },
          "layoutMode": {
            "enum": [
              1,
              2,
              3
            ],
            "type": "integer",
            "description": "Manga Reader Option: How many pages to display in the reader at once",
            "format": "int32"
          },
          "emulateBook": {
            "type": "boolean",
            "description": "Manga Reader Option: Emulate a book by applying a shadow effect on the pages"
          },
          "backgroundColor": {
            "minLength": 1,
            "type": "string",
            "description": "Manga Reader Option: Background color of the reader"
          },
          "swipeToPaginate": {
            "type": "boolean",
            "description": "Manga Reader Option: Should swiping trigger pagination"
          },
          "autoCloseMenu": {
            "type": "boolean",
            "description": "Manga Reader Option: Allow the menu to close after 6 seconds without interaction"
          },
          "showScreenHints": {
            "type": "boolean",
            "description": "Manga Reader Option: Show screen hints to the user on some actions, ie) pagination direction change"
          },
          "bookReaderMargin": {
            "type": "integer",
            "description": "Book Reader Option: Override extra Margin",
            "format": "int32"
          },
          "bookReaderLineSpacing": {
            "type": "integer",
            "description": "Book Reader Option: Override line-height",
            "format": "int32"
          },
          "bookReaderFontSize": {
            "type": "integer",
            "description": "Book Reader Option: Override font size",
            "format": "int32"
          },
          "bookReaderFontFamily": {
            "minLength": 1,
            "type": "string",
            "description": "Book Reader Option: Maps to the default Kavita font-family (inherit) or an override"
          },
          "bookReaderTapToPaginate": {
            "type": "boolean",
            "description": "Book Reader Option: Allows tapping on side of screens to paginate"
          },
          "bookReaderReadingDirection": {
            "enum": [
              0,
              1
            ],
            "type": "integer",
            "description": "Book Reader Option: What direction should the next/prev page buttons go",
            "format": "int32"
          },
          "bookReaderWritingStyle": {
            "enum": [
              0,
              1
            ],
            "type": "integer",
            "description": "Book Reader Option: What writing style should be used, horizontal or vertical.",
            "format": "int32"
          },
          "theme": {
            "$ref": "#/components/schemas/SiteTheme"
          },
          "bookReaderThemeName": {
            "minLength": 1,
            "type": "string"
          },
          "bookReaderLayoutMode": {
            "enum": [
              0,
              1,
              2
            ],
            "type": "integer",
            "format": "int32"
          },
          "bookReaderImmersiveMode": {
            "type": "boolean",
            "description": "Book Reader Option: A flag that hides the menu-ing system behind a click on the screen. This should be used with tap to paginate, but the app doesn't enforce this."
          },
          "globalPageLayoutMode": {
            "enum": [
              0,
              1
            ],
            "type": "integer",
            "description": "Global Site Option: If the UI should layout items as Cards or List items",
            "format": "int32"
          },
          "blurUnreadSummaries": {
            "type": "boolean",
            "description": "UI Site Global Setting: If unread summaries should be blurred until expanded or unless user has read it already"
          },
          "promptForDownloadSize": {
            "type": "boolean",
            "description": "UI Site Global Setting: Should Kavita prompt user to confirm downloads that are greater than 100 MB."
          },
          "noTransitions": {
            "type": "boolean",
            "description": "UI Site Global Setting: Should Kavita disable CSS transitions"
          },
          "collapseSeriesRelationships": {
            "type": "boolean",
            "description": "When showing series, only parent series or series with no relationships will be returned"
          },
          "shareReviews": {
            "type": "boolean",
            "description": "UI Site Global Setting: Should series reviews be shared with all users in the server"
          },
          "locale": {
            "minLength": 1,
            "type": "string",
            "description": "UI Site Global Setting: The language locale that should be used for the user"
          }
        },
        "additionalProperties": false
      },
      "UserReadStatistics": {
        "type": "object",
        "properties": {
          "totalPagesRead": {
            "type": "integer",
            "description": "Total number of pages read",
            "format": "int64"
          },
          "totalWordsRead": {
            "type": "integer",
            "description": "Total number of words read",
            "format": "int64"
          },
          "timeSpentReading": {
            "type": "integer",
            "description": "Total time spent reading based on estimates",
            "format": "int64"
          },
          "chaptersRead": {
            "type": "integer",
            "format": "int64"
          },
          "lastActive": {
            "type": "string",
            "format": "date-time"
          },
          "avgHoursPerWeekSpentReading": {
            "type": "number",
            "format": "double"
          },
          "percentReadPerLibrary": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SingleStatCount"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UserReviewDto": {
        "type": "object",
        "properties": {
          "tagline": {
            "type": "string",
            "description": "A tagline for the review",
            "nullable": true
          },
          "body": {
            "type": "string",
            "description": "The main review",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "description": "The series this is for",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "description": "The library this series belongs in",
            "format": "int32"
          },
          "username": {
            "type": "string",
            "description": "The user who wrote this",
            "nullable": true
          },
          "score": {
            "type": "integer",
            "description": "How many upvotes this review has gotten",
            "format": "int32"
          },
          "externalUrl": {
            "type": "string",
            "description": "If External, the url of the review",
            "nullable": true
          },
          "isExternal": {
            "type": "boolean",
            "description": "Does this review come from an external Source"
          },
          "bodyJustText": {
            "type": "string",
            "description": "The main body with just text, for review preview",
            "nullable": true
          },
          "provider": {
            "enum": [
              0,
              1,
              2
            ],
            "type": "integer",
            "description": "If this review is External, which Provider did it come from",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Represents a User Review for a given Series"
      },
      "Volume": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "A String representation of the volume number. Allows for floats.",
            "nullable": true
          },
          "number": {
            "type": "integer",
            "description": "The minimum number in the Name field in Int form",
            "format": "int32"
          },
          "chapters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Chapter"
            },
            "nullable": true
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "lastModified": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "coverImage": {
            "type": "string",
            "description": "Absolute path to the (managed) image file",
            "nullable": true
          },
          "pages": {
            "type": "integer",
            "description": "Total pages of all chapters in this volume",
            "format": "int32"
          },
          "wordCount": {
            "type": "integer",
            "description": "Total Word count of all chapters in this volume.",
            "format": "int64"
          },
          "minHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "maxHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "avgHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "series": {
            "$ref": "#/components/schemas/Series"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "VolumeDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "number": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "pages": {
            "type": "integer",
            "format": "int32"
          },
          "pagesRead": {
            "type": "integer",
            "format": "int32"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "created": {
            "type": "string",
            "description": "When chapter was created in local server time",
            "format": "date-time"
          },
          "lastModified": {
            "type": "string",
            "description": "When chapter was last modified in local server time",
            "format": "date-time"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "chapters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChapterDto"
            },
            "nullable": true
          },
          "minHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "maxHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "avgHoursToRead": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      }
    },
    "securitySchemes": {
      "Bearer": {
        "type": "apiKey",
        "description": "Please insert JWT with Bearer into field",
        "name": "Authorization",
        "in": "header"
      }
    }
  },
  "security": [
    {
      "Bearer": [ ]
    }
  ],
  "tags": [
    {
      "name": "Account",
      "description": "All Account matters"
    },
    {
      "name": "Cbl",
      "description": "Responsible for the CBL import flow"
    },
    {
      "name": "Collection",
      "description": "APIs for Collections"
    },
    {
      "name": "Device",
      "description": "Responsible interacting and creating Devices"
    },
    {
      "name": "Download",
      "description": "All APIs related to downloading entities from the system. Requires Download Role or Admin Role."
    },
    {
      "name": "Image",
      "description": "Responsible for servicing up images stored in Kavita for entities"
    },
    {
      "name": "Rating",
      "description": "Responsible for providing external ratings for Series"
    },
    {
      "name": "Reader",
      "description": "For all things regarding reading, mainly focusing on non-Book related entities"
    },
    {
      "name": "Search",
      "description": "Responsible for the Search interface from the UI"
    },
    {
      "name": "Tachiyomi",
      "description": "All APIs are for Tachiyomi extension and app. They have hacks for our implementation and should not be used for any\r\nother purposes."
    },
    {
      "name": "Upload",
      "description": ""
    },
    {
      "name": "WantToRead",
      "description": "Responsible for all things Want To Read"
    }
  ]
}