Ctrl K
ComunidadGuías…

openapi.json

Rama develop · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
{
  "openapi": "3.0.4",
  "info": {
    "title": "Kavita",
    "description": "Kavita provides a set of APIs authenticated via an Auth Key passed in the `x-api-key` header. Generate an Auth Key under User Settings → Manage Auth Keys, paste it into the Authorize panel, and all Try It requests will include it. Assume all fields of a payload are required unless marked optional. Built against v0.9.1.22",
    "license": {
      "name": "GPL-3.0",
      "url": "https://github.com/Kareadita/Kavita/blob/develop/LICENSE"
    },
    "version": "0.9.1.22"
  },
  "servers": [
    {
      "url": "{protocol}://{hostpath}",
      "variables": {
        "protocol": {
          "default": "http",
          "enum": [
            "http",
            "https"
          ]
        },
        "hostpath": {
          "default": "localhost:5000"
        }
      }
    }
  ],
  "paths": {
    "/api/Account/oidc-authenticated": {
      "get": {
        "tags": [
          "Account"
        ],
        "summary": "Returns true if OIDC authentication cookies are present and the Kavita.Server.Extensions.IdentityServiceExtensions.OpenIdConnect\nscheme has been registered",
        "description": "Makes no guarantee about their validity",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/clear-oidc-link": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Remove the OIDC link for the authenticated user. This action will also remove the authentication cookie.\nThe caller should take note and redirect to login if no other authentication is currently present (I.e. JWT)",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Account": {
      "get": {
        "tags": [
          "Account"
        ],
        "summary": "Returns the current user, as it would from login",
        "description": "Does not return tokens for the user",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              }
            }
          }
        }
      }
    },
    "/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": "OK"
          }
        }
      }
    },
    "/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": "OK",
            "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": "OK",
            "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": "OK",
            "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": "OK",
            "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 Kavita.Models.Constants.PolicyConstants",
        "responses": {
          "200": {
            "description": "OK",
            "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/update/username": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Initiates the flow to update a user's username.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUsernameRequestDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUsernameRequestDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUsernameRequestDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/InviteUserResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InviteUserResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/InviteUserResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/update/email": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Initiates the flow to update a user's email address.\n            \nIf email is not setup, then the email address is not changed in this API. A confirmation link is sent/dumped which will\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": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/InviteUserResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InviteUserResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/InviteUserResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/update/age-restriction": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Change the Age Rating restriction for the user",
        "requestBody": {
          "description": "",
          "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": "OK"
          }
        }
      }
    },
    "/api/Account/update": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Update the user account. This can only affect Username, Email (will require confirming), Roles, and Library access.",
        "description": "Users who's Kavita.Models.Entities.User.AppUser.IdentityProvider is not Kavita.Models.Entities.Enums.IdentityProvider.Kavita cannot be edited if Kavita.Models.DTOs.Settings.OidcConfigDto.SyncUserSettings is true",
        "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": "OK"
          }
        }
      }
    },
    "/api/Account/invite-url": {
      "get": {
        "tags": [
          "Account"
        ],
        "summary": "Requests the Invite Url for the AppUserId. 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": "OK",
            "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 email is not setup, a link will be presented to user to continue setup.",
        "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": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/InviteUserResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InviteUserResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/InviteUserResponse"
                }
              }
            }
          }
        }
      }
    },
    "/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": "OK",
            "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": "OK"
          }
        }
      }
    },
    "/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": "OK",
            "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": "OK",
            "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": "OK",
            "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": "OK",
            "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": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/InviteUserResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InviteUserResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/InviteUserResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/opds-url": {
      "get": {
        "tags": [
          "Account"
        ],
        "summary": "Returns the OPDS url for this user",
        "parameters": [
          {
            "name": "authKeyName",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/is-email-valid": {
      "get": {
        "tags": [
          "Account"
        ],
        "summary": "Is the user's current email valid or not",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/auth-keys": {
      "get": {
        "tags": [
          "Account"
        ],
        "summary": "Returns all Auth Keys with the account",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AuthKeyDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AuthKeyDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AuthKeyDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/rotate-auth-key": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Rotate the Auth Key",
        "parameters": [
          {
            "name": "authKeyId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RotateAuthKeyRequestDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RotateAuthKeyRequestDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RotateAuthKeyRequestDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/AuthKeyDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthKeyDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthKeyDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/create-auth-key": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Creates a new Auth Key for a user.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RotateAuthKeyRequestDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RotateAuthKeyRequestDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RotateAuthKeyRequestDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/AuthKeyDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthKeyDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthKeyDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/auth-key": {
      "delete": {
        "tags": [
          "Account"
        ],
        "summary": "Delete the Auth Key",
        "parameters": [
          {
            "name": "authKeyId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Activity/current": {
      "get": {
        "tags": [
          "Activity"
        ],
        "summary": "Returns active reading sessions on the Server",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingSessionDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingSessionDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingSessionDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/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 set up.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Annotation/all-filtered": {
      "post": {
        "tags": [
          "Annotation"
        ],
        "summary": "Returns a list of annotations for browsing",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationFilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationFilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationFilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AnnotationDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AnnotationDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AnnotationDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Annotation/all": {
      "get": {
        "tags": [
          "Annotation"
        ],
        "summary": "Returns the annotations for the given chapter",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AnnotationDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AnnotationDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AnnotationDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Annotation/all-for-series": {
      "get": {
        "tags": [
          "Annotation"
        ],
        "summary": "Returns all annotations by Series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/AnnotationDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnnotationDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnnotationDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Annotation/{annotationId}": {
      "get": {
        "tags": [
          "Annotation"
        ],
        "summary": "Returns the Annotation by Id. User must have access to annotation.",
        "parameters": [
          {
            "name": "annotationId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/AnnotationDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnnotationDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnnotationDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Annotation/create": {
      "post": {
        "tags": [
          "Annotation"
        ],
        "summary": "Create a new Annotation for the user against a Chapter",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/AnnotationDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnnotationDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnnotationDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Annotation/update": {
      "post": {
        "tags": [
          "Annotation"
        ],
        "summary": "Update the modifiable fields (Spoiler, highlight slot, and comment) for an annotation",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/AnnotationDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnnotationDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnnotationDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Annotation/like": {
      "post": {
        "tags": [
          "Annotation"
        ],
        "summary": "Adds a like for the currently authenticated user if not already from the annotations with given ids",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Annotation/unlike": {
      "post": {
        "tags": [
          "Annotation"
        ],
        "summary": "Removes likes for the currently authenticated user if present from the annotations with given ids",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Annotation": {
      "delete": {
        "tags": [
          "Annotation"
        ],
        "summary": "Delete the annotation for the user",
        "parameters": [
          {
            "name": "annotationId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Annotation/bulk-delete": {
      "post": {
        "tags": [
          "Annotation"
        ],
        "summary": "Removes annotations in bulk. Requires every annotation to be owned by the authenticated user",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Annotation/export-filter": {
      "post": {
        "tags": [
          "Annotation"
        ],
        "summary": "Exports annotations for the given users",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationFilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationFilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationFilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Annotation/export": {
      "post": {
        "tags": [
          "Annotation"
        ],
        "summary": "Exports Annotations for the User",
        "requestBody": {
          "description": "Export annotations with the given ids",
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Book/{chapterId}/book-info": {
      "get": {
        "tags": [
          "Book"
        ],
        "summary": "Retrieves information for the PDF and Epub reader. This will cache the file.",
        "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": "OK",
            "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": "OK"
          }
        }
      }
    },
    "/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\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": "OK",
            "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,\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": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Cbl/sync": {
      "post": {
        "tags": [
          "Cbl"
        ],
        "summary": "Enqueues the Reading List to be synced on a background thread. UI will be informed from Kavita.Models.DTOs.SignalR.MessageFactory.ReadingListUpdated event",
        "parameters": [
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "force",
            "in": "query",
            "description": "Ignore Hash and force sync flow",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Cbl/file-import": {
      "post": {
        "tags": [
          "Cbl"
        ],
        "summary": "Saves an uploaded CBL file to disk without importing. Returns the saved file info.",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "cblFile": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              },
              "encoding": {
                "cblFile": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/CblSavedFileDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CblSavedFileDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/CblSavedFileDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Cbl/upload-cbl-file": {
      "post": {
        "tags": [
          "Cbl"
        ],
        "summary": "Downloads a CBL file from a URL and saves it to disk without importing.",
        "requestBody": {
          "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": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/CblSavedFileDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CblSavedFileDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/CblSavedFileDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Cbl/repo-import": {
      "post": {
        "tags": [
          "Cbl"
        ],
        "summary": "Downloads selected CBL files from the GitHub repo and saves them to disk without importing.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CblRepoImportRequestDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CblRepoImportRequestDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CblRepoImportRequestDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CblSavedFileDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CblSavedFileDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CblSavedFileDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Cbl/re-validate": {
      "post": {
        "tags": [
          "Cbl"
        ],
        "summary": "Validates an already-saved CBL file on disk. Called by the import modal after remap rule changes.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CblReValidateRequestDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CblReValidateRequestDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CblReValidateRequestDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/CblImportSummaryDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CblImportSummaryDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/CblImportSummaryDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Cbl/finalize-import": {
      "post": {
        "tags": [
          "Cbl"
        ],
        "summary": "Finalizes the import of a saved CBL file with user decisions",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CblFinalizeRequestDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CblFinalizeRequestDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CblFinalizeRequestDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/CblImportSummaryDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CblImportSummaryDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/CblImportSummaryDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Cbl/remap-rules": {
      "get": {
        "tags": [
          "Cbl"
        ],
        "summary": "Returns all remap rules accessible to the current user (own rules + global/admin rules).",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RemapRuleDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RemapRuleDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RemapRuleDto"
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Cbl"
        ],
        "summary": "Creates a new remap rule, or updates an existing one if a rule with the same\nCBL matching key (normalized name + volume + number) already exists for this user.\nWhen no explicit VolumeId is provided, attempts to auto-resolve a matching volume\non the target series from the CBL volume string.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateRemapRuleDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateRemapRuleDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateRemapRuleDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/RemapRuleDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RemapRuleDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/RemapRuleDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Cbl/remap-rules/all": {
      "get": {
        "tags": [
          "Cbl"
        ],
        "summary": "Returns all rules across all users",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RemapRuleDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RemapRuleDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RemapRuleDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Cbl/remap-rules/{id}/promote": {
      "post": {
        "tags": [
          "Cbl"
        ],
        "summary": "Promotes a remap rule to global scope. Admin-only.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/RemapRuleDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RemapRuleDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/RemapRuleDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Cbl/remap-rules/{id}/demote": {
      "post": {
        "tags": [
          "Cbl"
        ],
        "summary": "Demotes a global remap rule back to user-scoped. Admin-only.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/RemapRuleDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RemapRuleDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/RemapRuleDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Cbl/remap-rules/{id}": {
      "post": {
        "tags": [
          "Cbl"
        ],
        "summary": "Updates a remap rule with issue-level detail (volume/chapter).",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRemapRuleDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRemapRuleDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRemapRuleDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/RemapRuleDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RemapRuleDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/RemapRuleDto"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Cbl"
        ],
        "summary": "Deletes a remap rule. Users can only delete their own rules.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Cbl/browse": {
      "get": {
        "tags": [
          "Cbl"
        ],
        "summary": "Provides the browse CBL Repo interface. Requires Download role.",
        "parameters": [
          {
            "name": "path",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string",
              "default": ""
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/CblRepoBrowseResultDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CblRepoBrowseResultDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/CblRepoBrowseResultDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Chapter": {
      "get": {
        "tags": [
          "Chapter"
        ],
        "summary": "Gets a single chapter",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Chapter"
        ],
        "summary": "Removes a Chapter",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Chapter/delete-multiple": {
      "post": {
        "tags": [
          "Chapter"
        ],
        "summary": "Deletes multiple chapters and any volumes with no leftover chapters",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "The ID of the series",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "The IDs of the chapters to be deleted",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteChaptersDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteChaptersDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteChaptersDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Chapter/update": {
      "post": {
        "tags": [
          "Chapter"
        ],
        "summary": "Update chapter metadata",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateChapterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateChapterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateChapterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Chapter/chapter-detail-plus": {
      "get": {
        "tags": [
          "Chapter"
        ],
        "summary": "Returns Ratings and Reviews for an individual Chapter",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDetailPlusDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDetailPlusDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDetailPlusDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Collection": {
      "get": {
        "tags": [
          "Collection"
        ],
        "summary": "Returns all Collection tags for a given User",
        "parameters": [
          {
            "name": "ownedOnly",
            "in": "query",
            "description": "Exclude Promoted",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "sortByLastModified",
            "in": "query",
            "description": "Order by Last Modified rather than on Title",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AppUserCollectionDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AppUserCollectionDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AppUserCollectionDto"
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Collection"
        ],
        "summary": "Removes the collection tag from the user",
        "parameters": [
          {
            "name": "tagId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Collection/single": {
      "get": {
        "tags": [
          "Collection"
        ],
        "summary": "Returns a single Collection tag by Id for a given user",
        "parameters": [
          {
            "name": "collectionId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/AppUserCollectionDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppUserCollectionDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppUserCollectionDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Collection/all-series": {
      "get": {
        "tags": [
          "Collection"
        ],
        "summary": "Returns all collections that contain the Series for the user with the option to allow for promoted collections (non-user owned)",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "ownedOnly",
            "in": "query",
            "description": "",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AppUserCollectionDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AppUserCollectionDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AppUserCollectionDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/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": "OK",
            "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.\n<remarks>UI does not contain controls to update title</remarks>",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppUserCollectionDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AppUserCollectionDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AppUserCollectionDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/AppUserCollectionDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppUserCollectionDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppUserCollectionDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Collection/promote-multiple": {
      "post": {
        "tags": [
          "Collection"
        ],
        "summary": "Promote/UnPromote multiple collections in one go. Will only update the authenticated user's collections and will only work if the user has promotion role",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PromoteCollectionsDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/PromoteCollectionsDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/PromoteCollectionsDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Collection/delete-multiple": {
      "post": {
        "tags": [
          "Collection"
        ],
        "summary": "Delete multiple collections in one go",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteCollectionsDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteCollectionsDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteCollectionsDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Collection/update-for-series": {
      "post": {
        "tags": [
          "Collection"
        ],
        "summary": "Adds multiple series to a collection. 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": "OK"
          }
        }
      }
    },
    "/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": "OK"
          }
        }
      }
    },
    "/api/Collection/mal-stacks": {
      "get": {
        "tags": [
          "Collection"
        ],
        "summary": "For the authenticated user, if they have an active Kavita+ subscription and a MAL username on record,\nfetch their Mal interest stacks (including restacks)",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MalStackDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MalStackDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MalStackDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Collection/import-stack": {
      "post": {
        "tags": [
          "Collection"
        ],
        "summary": "Imports a MAL Stack into Kavita",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MalStackDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MalStackDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MalStackDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/ColorScape/series": {
      "get": {
        "tags": [
          "ColorScape"
        ],
        "summary": "Returns the color scape for a series",
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ColorScapeDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ColorScapeDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ColorScapeDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/ColorScape/volume": {
      "get": {
        "tags": [
          "ColorScape"
        ],
        "summary": "Returns the color scape for a volume",
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ColorScapeDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ColorScapeDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ColorScapeDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/ColorScape/chapter": {
      "get": {
        "tags": [
          "ColorScape"
        ],
        "summary": "Returns the color scape for a chapter",
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ColorScapeDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ColorScapeDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ColorScapeDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Device/create": {
      "post": {
        "tags": [
          "Device"
        ],
        "summary": "Creates a new Device",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateEmailDeviceDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateEmailDeviceDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateEmailDeviceDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/EmailDeviceDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailDeviceDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailDeviceDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Device/update": {
      "post": {
        "tags": [
          "Device"
        ],
        "summary": "Updates an existing Device",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateEmailDeviceDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateEmailDeviceDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateEmailDeviceDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/EmailDeviceDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailDeviceDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailDeviceDto"
                }
              }
            }
          }
        }
      }
    },
    "/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": "OK"
          }
        }
      },
      "get": {
        "tags": [
          "Device"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EmailDeviceDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EmailDeviceDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EmailDeviceDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Device/send-to": {
      "post": {
        "tags": [
          "Device"
        ],
        "summary": "Sends a collection of chapters to the user's device",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SendToEmailDeviceDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SendToEmailDeviceDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SendToEmailDeviceDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Device/send-series-to": {
      "post": {
        "tags": [
          "Device"
        ],
        "summary": "Attempts to send a whole series to a device.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SendSeriesToEmailDeviceDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SendSeriesToEmailDeviceDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SendSeriesToEmailDeviceDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Device/client/devices": {
      "get": {
        "tags": [
          "Device"
        ],
        "summary": "Get my client devices",
        "parameters": [
          {
            "name": "includeInactive",
            "in": "query",
            "description": "",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ClientDeviceDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ClientDeviceDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ClientDeviceDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Device/client/all-devices": {
      "get": {
        "tags": [
          "Device"
        ],
        "summary": "Get All user client devices",
        "parameters": [
          {
            "name": "includeInactive",
            "in": "query",
            "description": "",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ClientDeviceDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ClientDeviceDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ClientDeviceDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Device/client/device": {
      "delete": {
        "tags": [
          "Device"
        ],
        "summary": "Removes the client device from DB",
        "parameters": [
          {
            "name": "clientDeviceId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Device/client/update-name": {
      "post": {
        "tags": [
          "Device"
        ],
        "summary": "Update the friendly name of the Device",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateClientDeviceNameDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateClientDeviceNameDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateClientDeviceNameDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/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": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              },
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              },
              "text/json": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              }
            }
          }
        }
      }
    },
    "/api/Download/bulk-volume-size": {
      "post": {
        "tags": [
          "Download"
        ],
        "summary": "For a set of volumes, return the size in bytes",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkVolumeSizeRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkVolumeSizeRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BulkVolumeSizeRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "integer",
                    "format": "int64"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "integer",
                    "format": "int64"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "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": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              },
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              },
              "text/json": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              }
            }
          }
        }
      }
    },
    "/api/Download/bulk-chapter-size": {
      "post": {
        "tags": [
          "Download"
        ],
        "summary": "For a set of chapters, return the size in bytes",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkChapterSizeRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkChapterSizeRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BulkChapterSizeRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "integer",
                    "format": "int64"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "integer",
                    "format": "int64"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "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": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              },
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              },
              "text/json": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              }
            }
          }
        }
      }
    },
    "/api/Download/readinglist-size": {
      "get": {
        "tags": [
          "Download"
        ],
        "summary": "Returns the filesize for all items of a reading list that the requesting user has access to",
        "parameters": [
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              },
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              },
              "text/json": {
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              }
            }
          }
        }
      }
    },
    "/api/Download/bulk-readinglist-size": {
      "post": {
        "tags": [
          "Download"
        ],
        "summary": "Returns the mapping of readinglist -> size",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkReadingListSizeRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkReadingListSizeRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BulkReadingListSizeRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "integer",
                    "format": "int64"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "integer",
                    "format": "int64"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "integer",
                    "format": "int64"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Download/bulk-series-size": {
      "post": {
        "tags": [
          "Download"
        ],
        "summary": "For a set of series, return the size in bytes",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkSeriesSizeRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkSeriesSizeRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BulkSeriesSizeRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "integer",
                    "format": "int64"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "integer",
                    "format": "int64"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "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"
            }
          },
          {
            "name": "correlationId",
            "in": "query",
            "description": "Only for UI",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/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"
            }
          },
          {
            "name": "correlationId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Download/series": {
      "get": {
        "tags": [
          "Download"
        ],
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "correlationId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/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": "OK"
          }
        }
      }
    },
    "/api/Email/all": {
      "get": {
        "tags": [
          "Email"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EmailHistoryDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EmailHistoryDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EmailHistoryDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Filter/update/series": {
      "post": {
        "tags": [
          "Filter"
        ],
        "summary": "Creates or Updates the Series filter",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesFilterV2Dto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesFilterV2Dto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesFilterV2Dto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Filter/update/reading-list": {
      "post": {
        "tags": [
          "Filter"
        ],
        "summary": "Creates or Updates the Reading List filter",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReadingListFilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ReadingListFilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ReadingListFilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Filter/update/person": {
      "post": {
        "tags": [
          "Filter"
        ],
        "summary": "Creates or Updates the Person filter",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PersonFilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/PersonFilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/PersonFilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Filter/update/annotation": {
      "post": {
        "tags": [
          "Filter"
        ],
        "summary": "Creates or Updates the Reading List filter",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationFilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationFilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationFilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Filter": {
      "get": {
        "tags": [
          "Filter"
        ],
        "summary": "All Smart Filters for the authenticated user",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SmartFilterDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SmartFilterDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SmartFilterDto"
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Filter"
        ],
        "summary": "Delete the smart filter for the authenticated user",
        "description": "User must not be in Kavita.Models.Constants.PolicyConstants.ReadOnlyRole",
        "parameters": [
          {
            "name": "filterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Filter/encode/series": {
      "post": {
        "tags": [
          "Filter"
        ],
        "summary": "Encode a Series filter",
        "requestBody": {
          "description": "This must be entityType Series",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesFilterV2Dto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesFilterV2Dto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesFilterV2Dto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Filter/encode/reading-list": {
      "post": {
        "tags": [
          "Filter"
        ],
        "summary": "Encode a Reading List filter",
        "requestBody": {
          "description": "This must be entityType ReadingList",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReadingListFilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ReadingListFilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ReadingListFilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Filter/encode/person": {
      "post": {
        "tags": [
          "Filter"
        ],
        "summary": "Encode a Person Filter",
        "requestBody": {
          "description": "This must be entityType Person",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PersonFilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/PersonFilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/PersonFilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Filter/encode/annotation": {
      "post": {
        "tags": [
          "Filter"
        ],
        "summary": "Encode an Annotation Filter",
        "requestBody": {
          "description": "This must be entityType Annotation",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationFilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationFilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AnnotationFilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Filter/decode": {
      "post": {
        "tags": [
          "Filter"
        ],
        "summary": "Decodes the Filter",
        "description": "Decoded filter will always have the same shape of Kavita.Models.DTOs.Filtering.v2.IFilterDto`2.\n            The concrete class is driven by `EntityType`.\n            Classes: Kavita.Models.DTOs.Filtering.v2.Requests.SeriesFilterV2Dto, Kavita.Models.DTOs.Filtering.v2.Requests.PersonFilterDto, Kavita.Models.DTOs.Filtering.v2.Requests.AnnotationFilterDto, Kavita.Models.DTOs.Filtering.v2.Requests.ReadingListFilterDto",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DecodeFilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DecodeFilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DecodeFilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/IFilterDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IFilterDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/IFilterDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Filter/rename": {
      "post": {
        "tags": [
          "Filter"
        ],
        "summary": "Rename a Smart Filter given the filterId and new name",
        "parameters": [
          {
            "name": "filterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "name",
            "in": "query",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Font/all": {
      "get": {
        "tags": [
          "Font"
        ],
        "summary": "List out the fonts",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EpubFontDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EpubFontDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EpubFontDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Font": {
      "get": {
        "tags": [
          "Font"
        ],
        "summary": "Returns a font file",
        "parameters": [
          {
            "name": "fontId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "Font"
        ],
        "summary": "Removes a font family from the system. The family is validated for in-use server side and only removed when\nit is not selected by a user, or when force is true.",
        "parameters": [
          {
            "name": "fontId",
            "in": "query",
            "description": "Any file within the family to delete",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "force",
            "in": "query",
            "description": "True to force deletion if the font is in use. This is prompted in the UI.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FontDeleteResultDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FontDeleteResultDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FontDeleteResultDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Font/upload": {
      "post": {
        "tags": [
          "Font"
        ],
        "summary": "Manual upload",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "formFile": {
                    "type": "string",
                    "description": "",
                    "format": "binary"
                  }
                }
              },
              "encoding": {
                "formFile": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/EpubFontDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EpubFontDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/EpubFontDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Font/upload-by-url": {
      "post": {
        "tags": [
          "Font"
        ],
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EpubFontDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EpubFontDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EpubFontDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Health": {
      "get": {
        "tags": [
          "Health"
        ],
        "summary": "No-op method that just returns Ok. Used for health checks in Docker containers.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Image/chapter-cover": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns cover image for Chapter",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Image/library-cover": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns cover image for Library",
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Image/volume-cover": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns cover image for Volume",
        "parameters": [
          {
            "name": "volumeId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/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"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Image/collection-cover": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns cover image for Collection",
        "parameters": [
          {
            "name": "collectionTagId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/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"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/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": "imageOffset",
            "in": "query",
            "description": "Only applicable for Epubs - handles multiple images on one page",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Image/web-link": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns the image associated with a web-link",
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Image/publisher": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns the image associated with a publisher",
        "parameters": [
          {
            "name": "publisherName",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Image/person-cover": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns cover image for Person",
        "parameters": [
          {
            "name": "personId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Image/user-cover": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns cover image for User",
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Image/cover-upload": {
      "get": {
        "tags": [
          "Image"
        ],
        "summary": "Returns a temp coverupload image",
        "description": "Requires Admin Role to perform upload",
        "parameters": [
          {
            "name": "filename",
            "in": "query",
            "description": "Filename of file. This is used with upload/upload-by-url",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Image/external/series": {
      "get": {
        "tags": [
          "Image"
        ],
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ExternalCoverResponseDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ExternalCoverResponseDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ExternalCoverResponseDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Image/external/volume": {
      "get": {
        "tags": [
          "Image"
        ],
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "volumeId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ExternalCoverResponseDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ExternalCoverResponseDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ExternalCoverResponseDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Image/external/chapter": {
      "get": {
        "tags": [
          "Image"
        ],
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "chapterId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ExternalCoverResponseDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ExternalCoverResponseDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ExternalCoverResponseDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/kavita-plus-audit/entries": {
      "post": {
        "tags": [
          "KavitaPlusAudit"
        ],
        "summary": "Returns a paged, filtered list of all Kavita+ audit events. Admin only.",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KavitaPlusAuditFilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/KavitaPlusAuditFilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/KavitaPlusAuditFilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KavitaPlusAuditEntryDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KavitaPlusAuditEntryDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KavitaPlusAuditEntryDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/kavita-plus-audit/entries/series/{seriesId}": {
      "get": {
        "tags": [
          "KavitaPlusAudit"
        ],
        "summary": "Returns Kavita+ audit info scoped to a single series, for the popover.\nScrobble events are filtered to the calling user unless they are an admin.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/KavitaPlusAuditSeriesInfoDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KavitaPlusAuditSeriesInfoDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/KavitaPlusAuditSeriesInfoDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/kavita-plus-audit/stats": {
      "get": {
        "tags": [
          "KavitaPlusAudit"
        ],
        "summary": "Returns aggregate stats for the admin audit feed",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/KavitaPlusAuditStatsDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KavitaPlusAuditStatsDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/KavitaPlusAuditStatsDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/kavita-plus-audit/my-stats": {
      "get": {
        "tags": [
          "KavitaPlusAudit"
        ],
        "summary": "Aggregate stats for my activity audit feed",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/KavitaPlusMyAuditStatsDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KavitaPlusMyAuditStatsDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/KavitaPlusMyAuditStatsDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/kavita-plus-audit/my-activity": {
      "post": {
        "tags": [
          "KavitaPlusAudit"
        ],
        "summary": "Returns the calling user's own Kavita+ activity, paged and filtered.",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KavitaPlusAuditFilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/KavitaPlusAuditFilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/KavitaPlusAuditFilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KavitaPlusAuditEntryDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KavitaPlusAuditEntryDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KavitaPlusAuditEntryDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/kavita-plus-audit/failed-scrobble-events": {
      "get": {
        "tags": [
          "KavitaPlusAudit"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "text/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/Kobo/{apiKey}/v1/initialization": {
      "get": {
        "tags": [
          "Kobo"
        ],
        "summary": "First request when starting the sync flow. Returns all config for the Kobo to make request. We inject some\nredirect to the Kavita instance\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/Kobo/{apiKey}/v1/library/sync": {
      "get": {
        "tags": [
          "Kobo"
        ],
        "summary": "Returns changes since last sync\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/Kobo/{apiKey}/v1/library/{bookId}/metadata": {
      "get": {
        "tags": [
          "Kobo"
        ],
        "summary": "Metadata for the given book. Called when opening information, and sometimes during sync but not always\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "bookId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/Kobo/{apiKey}/v1/library/{bookId}/state": {
      "get": {
        "tags": [
          "Kobo"
        ],
        "summary": "Gets progress. Called on book open to sync\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "bookId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "put": {
        "tags": [
          "Kobo"
        ],
        "summary": "Updates progress. Call on book close and when switching chapters via ToC while connected to the internet.\nOtherwise, during sync\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "bookId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/Kobo/{apiKey}/v1/library/{bookId}/file/epub": {
      "get": {
        "tags": [
          "Kobo"
        ],
        "summary": "Gets the (k)epub file\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "bookId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "convert",
            "in": "query",
            "description": "",
            "schema": {
              "type": "boolean",
              "default": true
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/Kobo/{apiKey}/v1/books/{thumbnailId}/thumbnail/{width}/{height}/{isGreyScale}/image.jpg": {
      "get": {
        "tags": [
          "Kobo"
        ],
        "summary": "Gets the cover. Called during sync, and on extra info when missing\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "thumbnailId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "width",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "height",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "isGreyScale",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/Kobo/{apiKey}/v1/books/{thumbnailId}/thumbnail/{width}/{height}/{quality}/{isGreyScale}/image.jpg": {
      "get": {
        "tags": [
          "Kobo"
        ],
        "summary": "Gets the cover. Called during sync, and on extra info when missing\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "thumbnailId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "width",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "height",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "quality",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "isGreyScale",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/Kobo/{apiKey}/v1/library/{bookId}": {
      "delete": {
        "tags": [
          "Kobo"
        ],
        "summary": "Called when a book is deleted from the Kobo. No-Op for Kavita books\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "bookId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "post": {
        "tags": [
          "Kobo"
        ],
        "summary": "Called when clicking on a recommendation. Adds the series to the Kobo sync collection if enabled\nOtherwise No-Op\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "bookId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/Kobo/{apiKey}/v1/products/{bookId}/reviews": {
      "get": {
        "tags": [
          "Kobo"
        ],
        "summary": "Returns reviews for the book. Implemented to reduce upstream bad requests.\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "bookId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "put": {
        "tags": [
          "Kobo"
        ],
        "summary": "Updates review for a book. Doesn't work 100%. Reviews are a bit weird on Kobo, needs more work\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "bookId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/Kobo/{apiKey}/v1/products/{bookId}/recommendations": {
      "get": {
        "tags": [
          "Kobo"
        ],
        "summary": "Returns the first books in a series that's recommended to the series the book belongs to\nRequires Kavita+ and Collection Sync\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "bookId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/Kobo/{apiKey}/v1/products/books/{bookId}": {
      "get": {
        "tags": [
          "Kobo"
        ],
        "summary": "Book metadata when viewing recommendations\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "bookId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/Kobo/{apiKey}/v1/products/{bookId}/nextread": {
      "get": {
        "tags": [
          "Kobo"
        ],
        "summary": "Implemented to reduce upstream bad requests. Called during sync, and sometimes otherwise\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "bookId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/Kobo/{apiKey}/v1/products/books/series/{bookId}": {
      "get": {
        "tags": [
          "Kobo"
        ],
        "summary": "Implemented to reduce upstream bad requests. Called during sync, and sometimes otherwise\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "bookId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/Kobo/{apiKey}/v1/products/{bookIds}/prices": {
      "get": {
        "tags": [
          "Kobo"
        ],
        "summary": "Implemented to reduce upstream bad requests. Always returns FREE\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "bookIds",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/Kobo/{apiKey}/v1/user/reviews": {
      "get": {
        "tags": [
          "Kobo"
        ],
        "summary": "Returns a list of reviews\n            \nNot intended for use beyond Kobo devices",
        "parameters": [
          {
            "name": "ProductIds",
            "in": "query",
            "description": "",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Koreader/{apiKey}/users/auth": {
      "get": {
        "tags": [
          "Koreader"
        ],
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Koreader/{apiKey}/syncs/progress": {
      "put": {
        "tags": [
          "Koreader"
        ],
        "summary": "Syncs book progress with Kavita. Will attempt to save the underlying reader position if possible.",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KoreaderBookDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/KoreaderBookDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/KoreaderBookDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/KoreaderProgressUpdateDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KoreaderProgressUpdateDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/KoreaderProgressUpdateDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Koreader/{apiKey}/syncs/progress/{ebookHash}": {
      "get": {
        "tags": [
          "Koreader"
        ],
        "summary": "Gets book progress from Kavita, if not found will return a 400",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ebookHash",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/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": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/LibraryDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LibraryDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/LibraryDto"
                }
              }
            }
          }
        }
      }
    },
    "/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": "OK",
            "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/has-files-at-root": {
      "post": {
        "tags": [
          "Library"
        ],
        "summary": "For each root, checks if there are any supported files at root to warn the user during library creation about an invalid setup",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CheckForFilesInFolderRootsDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CheckForFilesInFolderRootsDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CheckForFilesInFolderRootsDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "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/Library": {
      "get": {
        "tags": [
          "Library"
        ],
        "summary": "Return a specific library",
        "description": "If the user is not an admin, only id, type, and name will be returned (Kavita.Models.DTOs.LiteLibraryDto)",
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/LibraryDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LibraryDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/LibraryDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Library/libraries": {
      "get": {
        "tags": [
          "Library"
        ],
        "summary": "Return all libraries in the Server",
        "responses": {
          "200": {
            "description": "OK",
            "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/user-libraries": {
      "get": {
        "tags": [
          "Library"
        ],
        "summary": "Gets libraries for the given user that you also have access to",
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "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": "OK",
            "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": "OK",
            "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": "OK"
          }
        }
      }
    },
    "/api/Library/folder-watch/retry": {
      "post": {
        "tags": [
          "Library"
        ],
        "summary": "Watches the library again after its watcher missed a change or kept failing",
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FolderWatchStatusDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FolderWatchStatusDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FolderWatchStatusDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Library/watch-status": {
      "get": {
        "tags": [
          "Library"
        ],
        "summary": "How the library notices changes now and why",
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FolderWatchStatusDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FolderWatchStatusDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FolderWatchStatusDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Library/scan-multiple": {
      "post": {
        "tags": [
          "Library"
        ],
        "summary": "Enqueues a bunch of library scans",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkActionDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkActionDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BulkActionDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/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": "OK"
          }
        }
      }
    },
    "/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
            }
          },
          {
            "name": "forceColorscape",
            "in": "query",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Library/refresh-metadata-multiple": {
      "post": {
        "tags": [
          "Library"
        ],
        "parameters": [
          {
            "name": "forceColorscape",
            "in": "query",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkActionDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkActionDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BulkActionDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Library/copy-settings-from": {
      "post": {
        "tags": [
          "Library"
        ],
        "summary": "Copy the library settings (adv tab + optional type) to a set of other libraries.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CopySettingsFromLibraryDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CopySettingsFromLibraryDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CopySettingsFromLibraryDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/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": "OK"
          }
        }
      }
    },
    "/api/Library/delete": {
      "delete": {
        "tags": [
          "Library"
        ],
        "summary": "Deletes the library and all series within it.",
        "description": "This does not touch any files",
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Library/delete-multiple": {
      "delete": {
        "tags": [
          "Library"
        ],
        "summary": "Deletes multiple libraries and all series within it.",
        "description": "This does not touch any files",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/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": "OK",
            "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": "OK"
          }
        }
      }
    },
    "/api/Library/metadata-providers": {
      "get": {
        "tags": [
          "Library"
        ],
        "summary": "Return all Kavita.Models.Entities.Enums.MetadataProviders that are supported by the given Kavita.Models.Entities.Enums.LibraryType\"/>",
        "parameters": [
          {
            "name": "libraryType",
            "in": "query",
            "description": "",
            "schema": {
              "$ref": "#/components/schemas/LibraryType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MetadataProvider"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MetadataProvider"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MetadataProvider"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Library/metadata-enabled-libraries": {
      "get": {
        "tags": [
          "Library"
        ],
        "summary": "Kavita.Models.Entities.Enums.LibraryType with KavitaPlus metadata support",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LibraryType"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LibraryType"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LibraryType"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Library/scrobble-enabled-libraries": {
      "get": {
        "tags": [
          "Library"
        ],
        "summary": "Kavita.Models.Entities.Enums.LibraryType with KavitaPlus scrobble support",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LibraryType"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LibraryType"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LibraryType"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Library/type": {
      "get": {
        "tags": [
          "Library"
        ],
        "summary": "Returns the type of the underlying library",
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/LibraryType"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LibraryType"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/LibraryType"
                }
              }
            }
          }
        }
      }
    },
    "/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": "OK",
            "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 registered with the instance. Does not validate against Kavita+ API",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/License/info": {
      "get": {
        "tags": [
          "License"
        ],
        "summary": "Asks Kavita+ for the latest license info",
        "parameters": [
          {
            "name": "forceCheck",
            "in": "query",
            "description": "Force checking the API and skip the 8-hour cache",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/LicenseInfoDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LicenseInfoDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/LicenseInfoDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/License": {
      "delete": {
        "tags": [
          "License"
        ],
        "summary": "Remove the Kavita+ License on the Server",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "post": {
        "tags": [
          "License"
        ],
        "summary": "Updates server license",
        "description": "Caches the result when successful",
        "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": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/KavitaPlusRegisterResultDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KavitaPlusRegisterResultDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/KavitaPlusRegisterResultDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/License/reset": {
      "post": {
        "tags": [
          "License"
        ],
        "summary": "Break the registration between Kavita+ and this instance",
        "requestBody": {
          "description": "",
          "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": "OK"
          }
        }
      }
    },
    "/api/License/resend-license": {
      "post": {
        "tags": [
          "License"
        ],
        "summary": "Resend the welcome email to the user",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/License/provider-health": {
      "get": {
        "tags": [
          "License"
        ],
        "summary": "Provides a 15 min snapshot of Kavita+ Providers (Hardcover, AniList, MangaBaka, etc.) API health.\nKavita caches every 45 mins.",
        "parameters": [
          {
            "name": "forceCheck",
            "in": "query",
            "description": "Bypass cache and force a reload from Kavita+ server",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KavitaPlusProviderHealthSnapshotDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KavitaPlusProviderHealthSnapshotDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KavitaPlusProviderHealthSnapshotDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/License/stats": {
      "get": {
        "tags": [
          "License"
        ],
        "summary": "Providers how many interactions this license has had with Kavita+ over a lifetime",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/KavitaPlusLicenseUsageDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KavitaPlusLicenseUsageDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/KavitaPlusLicenseUsageDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/License/cancel": {
      "delete": {
        "tags": [
          "License"
        ],
        "summary": "Cancels the active Kavita+ Subscription tied to this server. License will elapse at end of billing period.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CancelKavitaPlusLicenseDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CancelKavitaPlusLicenseDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CancelKavitaPlusLicenseDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/License/products": {
      "get": {
        "tags": [
          "License"
        ],
        "summary": "Returns the available Kavita+ products (billing interval and list price) the renew flow can select.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KavitaPlusProductInfoDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KavitaPlusProductInfoDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KavitaPlusProductInfoDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/License/renew": {
      "post": {
        "tags": [
          "License"
        ],
        "summary": "Renews the subscription on the given billing interval and returns the Stripe Checkout (Pay Now) URL the customer visits to pay.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RenewKavitaPlusLicenseDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RenewKavitaPlusLicenseDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RenewKavitaPlusLicenseDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/License/change-email": {
      "post": {
        "tags": [
          "License"
        ],
        "summary": "Change email on Kavita+ License/Stripe - Sends a confirmation email on Kavita+ side. No-op for server.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeEmailOnLicenseDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeEmailOnLicenseDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeEmailOnLicenseDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Locale": {
      "get": {
        "tags": [
          "Locale"
        ],
        "summary": "Returns all applicable locales on the server",
        "description": "This can be cached as it will not change per version.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KavitaLocale"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KavitaLocale"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KavitaLocale"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Manage/series-metadata": {
      "post": {
        "tags": [
          "Manage"
        ],
        "summary": "Returns a list of all Series that is Kavita+ applicable to metadata match and the status of it",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ManageMatchFilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ManageMatchFilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ManageMatchFilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ManageMatchSeriesDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ManageMatchSeriesDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ManageMatchSeriesDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Manage/matched-series-counts": {
      "get": {
        "tags": [
          "Manage"
        ],
        "summary": "Returns high level counts for matched series page",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/MatchedExternalSeriesCountDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchedExternalSeriesCountDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchedExternalSeriesCountDto"
                }
              }
            }
          }
        }
      }
    },
    "/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"
            }
          },
          {
            "name": "context",
            "in": "query",
            "description": "Context from which this API was invoked",
            "schema": {
              "$ref": "#/components/schemas/QueryContext"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "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/genres-with-counts": {
      "post": {
        "tags": [
          "Metadata"
        ],
        "summary": "Returns a list of Genres with counts for counts when Genre is on Series/Chapter",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserParams"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UserParams"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UserParams"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BrowseGenreDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BrowseGenreDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BrowseGenreDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Metadata/people-by-role": {
      "get": {
        "tags": [
          "Metadata"
        ],
        "summary": "Fetches people from the instance by role",
        "parameters": [
          {
            "name": "role",
            "in": "query",
            "description": "role",
            "schema": {
              "$ref": "#/components/schemas/PersonRole"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "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/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": "OK",
            "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": "OK",
            "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/readinglist-tags": {
      "get": {
        "tags": [
          "Metadata"
        ],
        "summary": "Fetches Reading List Tags from the instance",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListTagDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListTagDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListTagDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Metadata/tags-with-counts": {
      "post": {
        "tags": [
          "Metadata"
        ],
        "summary": "Returns a list of Tags with counts for counts when Tag is on Series/Chapter",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserParams"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UserParams"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UserParams"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BrowseTagDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BrowseTagDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BrowseTagDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/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": "OK",
            "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": "OK",
            "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": "OK",
            "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"
        ],
        "summary": "Returns all languages Kavita can accept",
        "responses": {
          "200": {
            "description": "OK",
            "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-bcp47-languages": {
      "get": {
        "tags": [
          "Metadata"
        ],
        "summary": "Returns a list of all BCP47 Languages. `IsoCode` stores the BCP47 code",
        "responses": {
          "200": {
            "description": "OK",
            "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/language-title": {
      "get": {
        "tags": [
          "Metadata"
        ],
        "summary": "Given a language code returns the display name",
        "parameters": [
          {
            "name": "code",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Metadata/series-detail-plus": {
      "get": {
        "tags": [
          "Metadata"
        ],
        "summary": "Fetches the details needed from Kavita+ for Series Detail page",
        "description": "This will hit upstream K+ if the data in local db is 2 weeks old",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "Series Id",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "libraryType",
            "in": "query",
            "description": "Library Type",
            "schema": {
              "$ref": "#/components/schemas/LibraryType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDetailPlusDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDetailPlusDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDetailPlusDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/OAuth/start": {
      "get": {
        "tags": [
          "OAuth"
        ],
        "summary": "Start the OAuth flow for the given upstream, redirect (302!) to KavitaPlus",
        "parameters": [
          {
            "name": "upstream",
            "in": "query",
            "description": "",
            "schema": {
              "$ref": "#/components/schemas/OAuthUpstream"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/OAuth/callback": {
      "get": {
        "tags": [
          "OAuth"
        ],
        "summary": "Callback from KavitaPlus.",
        "parameters": [
          {
            "name": "upstream",
            "in": "query",
            "description": "",
            "schema": {
              "$ref": "#/components/schemas/OAuthUpstream"
            }
          },
          {
            "name": "token",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "apiKey",
            "in": "query",
            "description": "Encrypted ApiKey",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "refreshToken",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "expiresIn",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/Oidc/login": {
      "get": {
        "tags": [
          "Oidc"
        ],
        "parameters": [
          {
            "name": "returnUrl",
            "in": "query",
            "schema": {
              "type": "string",
              "default": "/"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/Oidc/logout": {
      "get": {
        "tags": [
          "Oidc"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}": {
      "post": {
        "tags": [
          "Opds"
        ],
        "summary": "Returns the Catalogue for Kavita's OPDS Service",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Returns the Catalogue for Kavita's OPDS Service",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/smart-filters/{filterId}": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Get the User's Smart Filter - Supports Pagination",
        "description": "Smart filters have different entity types, this will resolve to the underlying entity",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filterId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/smart-filters": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Get the User's Smart Filters (Dashboard Context) - Supports Pagination",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/libraries": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Get the User's Libraries - No Pagination Support",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/want-to-read": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Get the User's Want to Read list - Supports Pagination",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/collections": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Get all Collections - Supports Pagination",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/collections/{collectionId}": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Get Series for a given Collection - Supports Pagination",
        "parameters": [
          {
            "name": "collectionId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/reading-list": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Get a User's Reading Lists - Supports Pagination",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/reading-list/{readingListId}": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Returns individual items (chapters) from Reading List by ID - Supports Pagination",
        "parameters": [
          {
            "name": "readingListId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/libraries/{libraryId}": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Returns Series from the Library - Supports Pagination",
        "parameters": [
          {
            "name": "libraryId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/recently-added": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Returns Recently Added (Dashboard Feed) - Supports Pagination",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/recently-updated": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Get the Recently Updated Series (Dashboard) - Pagination available, total pages will not be filled due to underlying implementation",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/on-deck": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Get the On Deck (Dashboard) - Supports Pagination",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/series": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "OPDS Search endpoint",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/search": {
      "get": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/series/{seriesId}": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Returns the items within a Series (Series Detail)",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "seriesId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/series/{seriesId}/volume/{volumeId}": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Returns items for a given Volume",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "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"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/series/{seriesId}/volume/{volumeId}/chapter/{chapterId}": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Gets items for a given Chapter",
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "description": "",
            "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"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/series/{seriesId}/volume/{volumeId}/chapter/{chapterId}/download/{filename}": {
      "get": {
        "tags": [
          "Opds"
        ],
        "summary": "Downloads a file (user must have download permission)",
        "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": "OK"
          }
        }
      }
    },
    "/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"
            }
          },
          {
            "name": "saveProgress",
            "in": "query",
            "description": "Optional parameter. Can pass false and progress saving will be suppressed",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Opds/{apiKey}/favicon": {
      "get": {
        "tags": [
          "Opds"
        ],
        "parameters": [
          {
            "name": "apiKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Panels/save-progress": {
      "post": {
        "tags": [
          "Panels"
        ],
        "summary": "Saves the progress of a given chapter. This will generate a reading session with the estimated time from the\nlast progress till the current",
        "parameters": [
          {
            "name": "apiKey",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "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": "OK"
          }
        }
      }
    },
    "/api/Panels/get-progress": {
      "get": {
        "tags": [
          "Panels"
        ],
        "summary": "Gets the Progress of a given chapter",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "apiKey",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProgressDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProgressDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProgressDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Person": {
      "get": {
        "tags": [
          "Person"
        ],
        "parameters": [
          {
            "name": "name",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/PersonDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PersonDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/PersonDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Person/search": {
      "get": {
        "tags": [
          "Person"
        ],
        "summary": "Find a person by name or alias against a query string",
        "parameters": [
          {
            "name": "queryString",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "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/Person/roles": {
      "get": {
        "tags": [
          "Person"
        ],
        "summary": "Returns all roles for a Person",
        "parameters": [
          {
            "name": "personId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonRole"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonRole"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonRole"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Person/all": {
      "post": {
        "tags": [
          "Person"
        ],
        "summary": "Returns a list of authors and artists for browsing",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PersonFilterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/PersonFilterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/PersonFilterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BrowsePersonDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BrowsePersonDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BrowsePersonDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Person/update": {
      "post": {
        "tags": [
          "Person"
        ],
        "summary": "Updates the Person",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdatePersonDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdatePersonDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdatePersonDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/PersonDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PersonDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/PersonDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Person/coversdb-image": {
      "get": {
        "tags": [
          "Person"
        ],
        "summary": "Returns the CoversDB image url for a Person, if one can be matched. Does not apply the cover.",
        "parameters": [
          {
            "name": "personId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Person/series-known-for": {
      "get": {
        "tags": [
          "Person"
        ],
        "summary": "Returns the top 20 series that the \"person\" is known for. This will use Average Rating when applicable (Kavita+ field), else it's a random sort",
        "parameters": [
          {
            "name": "personId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "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/Person/chapters-by-role": {
      "get": {
        "tags": [
          "Person"
        ],
        "summary": "Returns all individual chapters by role. Limited to 20 results.",
        "parameters": [
          {
            "name": "personId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "role",
            "in": "query",
            "description": "",
            "schema": {
              "$ref": "#/components/schemas/PersonRole"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/StandaloneChapterDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/StandaloneChapterDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/StandaloneChapterDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Person/merge": {
      "post": {
        "tags": [
          "Person"
        ],
        "summary": "Merges Persons into one, this action is irreversible",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PersonMergeDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/PersonMergeDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/PersonMergeDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/PersonDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PersonDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/PersonDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Person/valid-alias": {
      "post": {
        "tags": [
          "Person"
        ],
        "summary": "Ensure the alias is valid to be added. For example, the alias cannot be on another person or be the same as the current person name/alias.",
        "requestBody": {
          "description": "alias check request",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PersonAliasCheckDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/PersonAliasCheckDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/PersonAliasCheckDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Plugin/authenticate": {
      "post": {
        "tags": [
          "Plugin"
        ],
        "summary": "Authenticate with the Server given an auth key. 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": "Auth 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": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Plugin/version": {
      "get": {
        "tags": [
          "Plugin"
        ],
        "summary": "Returns the version of the Kavita install",
        "description": "This will log unauthorized requests to Security log",
        "parameters": [
          {
            "name": "apiKey",
            "in": "query",
            "description": "Required for authenticating to get result",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Plugin/authkey-expires": {
      "get": {
        "tags": [
          "Plugin"
        ],
        "summary": "Returns the expiration (UTC) of the authenticated Auth key (or null if none set)",
        "description": "Will always return null if the Auth Key does not belong to this account",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/AuthKeyExpiresAtDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthKeyExpiresAtDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthKeyExpiresAtDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Plugin/parse": {
      "get": {
        "tags": [
          "Plugin"
        ],
        "summary": "Parse a string and return Parsed information from it. Does not support any directory fallback parsing",
        "parameters": [
          {
            "name": "name",
            "in": "query",
            "description": "String to parse",
            "schema": {
              "maxLength": 1000,
              "minLength": 0,
              "type": "string"
            }
          },
          {
            "name": "libraryType",
            "in": "query",
            "description": "Determines the set of pattern matching to use",
            "schema": {
              "$ref": "#/components/schemas/LibraryType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ParseResultDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ParseResultDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ParseResultDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Plugin/parse-bulk": {
      "post": {
        "tags": [
          "Plugin"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ParseBulkRequestDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ParseBulkRequestDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ParseBulkRequestDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ParseBulkResponseDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ParseBulkResponseDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ParseBulkResponseDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Rating/series": {
      "post": {
        "tags": [
          "Rating"
        ],
        "summary": "Update the users' rating of the given series",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRatingDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRatingDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRatingDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Rating/chapter": {
      "post": {
        "tags": [
          "Rating"
        ],
        "summary": "Update the users' rating of the given chapter",
        "requestBody": {
          "description": "chapterId must be set",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRatingDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRatingDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRatingDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Rating/overall-series": {
      "get": {
        "tags": [
          "Rating"
        ],
        "summary": "Overall rating from all Kavita users for a given Series",
        "description": "If the authenticated user is the only user to have rated the series, returns 0",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/RatingDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RatingDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/RatingDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Rating/overall-chapter": {
      "get": {
        "tags": [
          "Rating"
        ],
        "summary": "Overall rating from all Kavita users for a given Chapter",
        "description": "If the authenticated user is the only user to have rated the chapter, returns 0",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "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",
            "description": "Auth Key for authentication",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "extractPdf",
            "in": "query",
            "description": "Converts PDF into images per-page - Used for Mihon mainly",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/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": "OK"
          }
        }
      }
    },
    "/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": "OK"
          }
        }
      }
    },
    "/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": "OK"
          }
        }
      }
    },
    "/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.\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": "OK",
            "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": "OK",
            "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": "OK",
            "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-chapter-read": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Mark a single chapter as read",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkChapterReadDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkChapterReadDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MarkChapterReadDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/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": "OK"
          }
        }
      }
    },
    "/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": "OK"
          }
        }
      }
    },
    "/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": "OK"
          }
        }
      }
    },
    "/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": "OK"
          }
        }
      }
    },
    "/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": "OK"
          }
        }
      }
    },
    "/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": "OK"
          }
        }
      }
    },
    "/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": "OK"
          }
        }
      }
    },
    "/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": "OK"