GitHub Raw JSON API

Kareadita / Kavita

11,377 C#

Kavita is a fast, feature rich, cross platform reading server. Built with the goal of being a full solution for all your reading needs. Setup your own server and share your reading collection with your friends and family.

Kavita Specification

Located in openapi.json on branch HEAD

3.0.4 JSON 488 Endpoints 878.7 KB

Operations & Route Endpoints (100)

GET /api/Account/oidc-authenticated
Returns true if OIDC authentication cookies are present and the Kavita.Server.Extensions.IdentityServiceExtensions.OpenIdConnect scheme has been registered
POST /api/Account/clear-oidc-link
Remove the OIDC link for the authenticated user. This action will also remove the authentication cookie. The caller should take note and redirect to login if no other authentication is currently present (I.e. JWT)
GET /api/Account
Returns the current user, as it would from login
POST /api/Account/reset-password
Update a user's password
POST /api/Account/register
Register the first user (admin) on the server. Will not do anything if an admin is already confirmed
POST /api/Account/login
Perform a login. Will send JWT Token of the logged in user back.
GET /api/Account/refresh-account
Returns an up-to-date user account
POST /api/Account/refresh-token
Refreshes the user's JWT token
GET /api/Account/roles
Get All Roles back. See Kavita.Models.Constants.PolicyConstants
POST /api/Account/update/username
Initiates the flow to update a user's username.
POST /api/Account/update/email
Initiates the flow to update a user's email address. If email is not setup, then the email address is not changed in this API. A confirmation link is sent/dumped which will validate the email. It must be confirmed for the email to update.
POST /api/Account/update/age-restriction
Change the Age Rating restriction for the user
POST /api/Account/update
Update the user account. This can only affect Username, Email (will require confirming), Roles, and Library access.
GET /api/Account/invite-url
Requests the Invite Url for the AppUserId. Will return error if user is already validated.
POST /api/Account/invite
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.
POST /api/Account/confirm-email
Last step in authentication flow, confirms the email token for email
POST /api/Account/confirm-email-update
Final step in email update change. Given a confirmation token and the email, this will finish the email change.
POST /api/Account/confirm-password-reset
POST /api/Account/forgot-password
Will send user a link to update their password to their email or prompt them if not accessible
GET /api/Account/email-confirmed
POST /api/Account/confirm-migration-email
POST /api/Account/resend-confirmation-email
Resend an invite to a user already invited
GET /api/Account/opds-url
Returns the OPDS url for this user
GET /api/Account/is-email-valid
Is the user's current email valid or not
GET /api/Account/auth-keys
Returns all Auth Keys with the account
POST /api/Account/rotate-auth-key
Rotate the Auth Key
POST /api/Account/create-auth-key
Creates a new Auth Key for a user.
DELETE /api/Account/auth-key
Delete the Auth Key
GET /api/Activity/current
Returns active reading sessions on the Server
GET /api/Admin/exists
Checks if an admin exists on the system. This is essentially a check to validate if the system has been set up.
POST /api/Annotation/all-filtered
Returns a list of annotations for browsing
GET /api/Annotation/all
Returns the annotations for the given chapter
GET /api/Annotation/all-for-series
Returns all annotations by Series
GET /api/Annotation/{annotationId}
Returns the Annotation by Id. User must have access to annotation.
POST /api/Annotation/create
Create a new Annotation for the user against a Chapter
POST /api/Annotation/update
Update the modifiable fields (Spoiler, highlight slot, and comment) for an annotation
POST /api/Annotation/like
Adds a like for the currently authenticated user if not already from the annotations with given ids
POST /api/Annotation/unlike
Removes likes for the currently authenticated user if present from the annotations with given ids
DELETE /api/Annotation
Delete the annotation for the user
POST /api/Annotation/bulk-delete
Removes annotations in bulk. Requires every annotation to be owned by the authenticated user
POST /api/Annotation/export-filter
Exports annotations for the given users
POST /api/Annotation/export
Exports Annotations for the User
GET /api/Book/{chapterId}/book-info
Retrieves information for the PDF and Epub reader. This will cache the file.
GET /api/Book/{chapterId}/book-resources
This is an entry point to fetch resources from within an epub chapter/book.
GET /api/Book/{chapterId}/chapters
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 this is used to rewrite anchors in the book text so that we always load properly in our reader.
GET /api/Book/{chapterId}/book-page
This returns a single page within the epub book. All html will be rewritten to be scoped within our reader, all css is scoped, etc.
POST /api/Cbl/sync
Enqueues the Reading List to be synced on a background thread. UI will be informed from Kavita.Models.DTOs.SignalR.MessageFactory.ReadingListUpdated event
POST /api/Cbl/file-import
Saves an uploaded CBL file to disk without importing. Returns the saved file info.
POST /api/Cbl/upload-cbl-file
Downloads a CBL file from a URL and saves it to disk without importing.
POST /api/Cbl/repo-import
Downloads selected CBL files from the GitHub repo and saves them to disk without importing.
POST /api/Cbl/re-validate
Validates an already-saved CBL file on disk. Called by the import modal after remap rule changes.
POST /api/Cbl/finalize-import
Finalizes the import of a saved CBL file with user decisions
GET /api/Cbl/remap-rules
Returns all remap rules accessible to the current user (own rules + global/admin rules).
POST /api/Cbl/remap-rules
Creates a new remap rule, or updates an existing one if a rule with the same CBL matching key (normalized name + volume + number) already exists for this user. When no explicit VolumeId is provided, attempts to auto-resolve a matching volume on the target series from the CBL volume string.
GET /api/Cbl/remap-rules/all
Returns all rules across all users
POST /api/Cbl/remap-rules/{id}/promote
Promotes a remap rule to global scope. Admin-only.
POST /api/Cbl/remap-rules/{id}/demote
Demotes a global remap rule back to user-scoped. Admin-only.
POST /api/Cbl/remap-rules/{id}
Updates a remap rule with issue-level detail (volume/chapter).
DELETE /api/Cbl/remap-rules/{id}
Deletes a remap rule. Users can only delete their own rules.
GET /api/Cbl/browse
Provides the browse CBL Repo interface. Requires Download role.
GET /api/Chapter
Gets a single chapter
DELETE /api/Chapter
Removes a Chapter
POST /api/Chapter/delete-multiple
Deletes multiple chapters and any volumes with no leftover chapters
POST /api/Chapter/update
Update chapter metadata
GET /api/Chapter/chapter-detail-plus
Returns Ratings and Reviews for an individual Chapter
GET /api/Collection
Returns all Collection tags for a given User
DELETE /api/Collection
Removes the collection tag from the user
GET /api/Collection/single
Returns a single Collection tag by Id for a given user
GET /api/Collection/all-series
Returns all collections that contain the Series for the user with the option to allow for promoted collections (non-user owned)
GET /api/Collection/name-exists
Checks if a collection exists with the name
POST /api/Collection/update
Updates an existing tag with a new title, promotion status, and summary. <remarks>UI does not contain controls to update title</remarks>
POST /api/Collection/promote-multiple
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
POST /api/Collection/delete-multiple
Delete multiple collections in one go
POST /api/Collection/update-for-series
Adds multiple series to a collection. If tag id is 0, this will create a new tag.
POST /api/Collection/update-series
For a given tag, update the summary if summary has changed and remove a set of series from the tag.
GET /api/Collection/mal-stacks
For the authenticated user, if they have an active Kavita+ subscription and a MAL username on record, fetch their Mal interest stacks (including restacks)
POST /api/Collection/import-stack
Imports a MAL Stack into Kavita
GET /api/ColorScape/series
Returns the color scape for a series
GET /api/ColorScape/volume
Returns the color scape for a volume
GET /api/ColorScape/chapter
Returns the color scape for a chapter
POST /api/Device/create
Creates a new Device
POST /api/Device/update
Updates an existing Device
DELETE /api/Device
Deletes the device from the user
GET /api/Device
POST /api/Device/send-to
Sends a collection of chapters to the user's device
POST /api/Device/send-series-to
Attempts to send a whole series to a device.
GET /api/Device/client/devices
Get my client devices
GET /api/Device/client/all-devices
Get All user client devices
DELETE /api/Device/client/device
Removes the client device from DB
POST /api/Device/client/update-name
Update the friendly name of the Device
GET /api/Download/volume-size
For a given volume, return the size in bytes
POST /api/Download/bulk-volume-size
For a set of volumes, return the size in bytes
GET /api/Download/chapter-size
For a given chapter, return the size in bytes
POST /api/Download/bulk-chapter-size
For a set of chapters, return the size in bytes
GET /api/Download/series-size
For a series, return the size in bytes
GET /api/Download/readinglist-size
Returns the filesize for all items of a reading list that the requesting user has access to
POST /api/Download/bulk-readinglist-size
Returns the mapping of readinglist -> size
POST /api/Download/bulk-series-size
For a set of series, return the size in bytes
GET /api/Download/volume
Downloads all chapters within a volume. If the chapters are multiple zips, they will all be zipped up.
GET /api/Download/chapter
Returns the zip for a single chapter. If the chapter contains multiple files, they will be zipped.
Raw JSON Specification
{
  "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.0.20",
    "license": {
      "name": "GPL-3.0",
      "url": "https://github.com/Kareadita/Kavita/blob/develop/LICENSE"
    },
    "version": "0.9.0.20"
  },
  "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": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Account/confirm-email": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Last step in authentication flow, confirms the email token for email",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmEmailDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmEmailDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmEmailDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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"
          }
        }
      }
    },
    "/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 an admin forces the deletion.",
        "parameters": [
          {
            "name": "fontId",
            "in": "query",
            "description": "Any file within the family to delete",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "force",
            "in": "query",
            "description": "If the family is in use and an admin wants it deleted, they must confirm to force delete it. 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 header strip.",
        "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-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"
                }
              }
            }
          }
        }
      }
    },
    "/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/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",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Library/name-exists": {
      "get": {
        "tags": [
          "Library"
        ],
        "summary": "Checks if the library name exists or not",
        "parameters": [
          {
            "name": "name",
            "in": "query",
            "description": "If empty or null, will return true as that is invalid",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "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/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"
            }
          }
        ],
        "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/fetch-cover": {
      "post": {
        "tags": [
          "Person"
        ],
        "summary": "Attempts to download the cover from CoversDB (Note: Not yet release in Kavita)",
        "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"
          }
        }
      }
    },
    "/api/Reader/get-progress": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns Progress (page number) for a chapter for the logged in user",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProgressDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProgressDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProgressDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/progress": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Save page against Chapter for authenticated user",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProgressDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ProgressDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ProgressDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Reader/continue-point": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Continue point is the chapter which you should start reading again from. If there is no progress on a series, then the first chapter will be returned (non-special unless only specials).\nOtherwise, loop through the chapters and volumes in order to find the next chapter which has progress.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChapterDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/has-progress": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns if the user has reading progress on the Series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/chapter-bookmarks": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns a list of bookmarked pages for a given Chapter",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/all-bookmarks": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns a list of all bookmarked pages for a User",
        "requestBody": {
          "description": "Only supports SeriesNameQuery",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesFilterV2Dto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesFilterV2Dto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesFilterV2Dto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/remove-bookmarks": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Removes all bookmarks for all chapters linked to a Series",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RemoveBookmarkForSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RemoveBookmarkForSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RemoveBookmarkForSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Reader/bulk-remove-bookmarks": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Removes all bookmarks for all chapters linked to a Series",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkRemoveBookmarkForSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkRemoveBookmarkForSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BulkRemoveBookmarkForSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Reader/volume-bookmarks": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns all bookmarked pages for a given volume",
        "parameters": [
          {
            "name": "volumeId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/series-bookmarks": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns all bookmarked pages for a given series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BookmarkDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/bookmark": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Bookmarks a page against a Chapter",
        "description": "This has a side effect of caching the chapter files to disk",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookmarkDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BookmarkDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BookmarkDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Reader/unbookmark": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Removes a bookmarked page for a Chapter",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookmarkDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BookmarkDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BookmarkDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Reader/next-chapter": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns the next logical chapter from the series.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "volumeId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "currentChapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "text/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/prev-chapter": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns the previous logical chapter from the series.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "volumeId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "currentChapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "text/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/time-left": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "For the current user, returns an estimate on how long it would take to finish reading the series.",
        "description": "For Epubs, this does not check words inside a chapter due to overhead so may not work in all cases.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/HourEstimateRangeDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HourEstimateRangeDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/HourEstimateRangeDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/time-left-for-chapter": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "For the current user, returns an estimate on how long it would take to finish reading the chapter.",
        "description": "For Epubs, this does not check words inside a chapter due to overhead so may not work in all cases.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/HourEstimateRangeDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HourEstimateRangeDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/HourEstimateRangeDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/ptoc": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Returns the user's personal table of contents for the given chapter",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonalToCDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonalToCDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonalToCDto"
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Reader"
        ],
        "summary": "Deletes the user's personal table of content for the given chapter",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageNum",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "title",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Reader/create-ptoc": {
      "post": {
        "tags": [
          "Reader"
        ],
        "summary": "Create a new personal table of content entry for a given chapter",
        "description": "The title and page number must be unique to that book",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePersonalToCDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePersonalToCDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePersonalToCDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Reader/prompt-reread/series": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Check if we should prompt the user for rereads for the given series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "libraryId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/RereadDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RereadDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/RereadDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/prompt-reread/volume": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Check if we should prompt the user for rereads for the given volume",
        "parameters": [
          {
            "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"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/RereadDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RereadDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/RereadDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/prompt-reread/chapter": {
      "get": {
        "tags": [
          "Reader"
        ],
        "summary": "Check if we should prompt the user for rereads for the given chapter",
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/RereadDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RereadDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/RereadDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Reader/first-progress-date": {
      "get": {
        "tags": [
          "Reader"
        ],
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList": {
      "get": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Fetches a single Reading List",
        "parameters": [
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingListDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingListDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingListDto"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Deletes a reading list",
        "parameters": [
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/ReadingList/lists": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Returns reading lists (paginated) for a given user.",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "includePromoted",
            "in": "query",
            "description": "Include Promoted Reading Lists along with user's Reading Lists. Defaults to true",
            "schema": {
              "type": "boolean",
              "default": true
            }
          },
          {
            "name": "sortByLastModified",
            "in": "query",
            "description": "Sort by last modified (most recent first) or by title (alphabetical)",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/all": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Returns reading lists (paginated) for a given user.",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "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",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/lists-for-series": {
      "get": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Returns all Reading Lists the user has access to that the given series within it.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/lists-for-chapter": {
      "get": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Returns all Reading Lists the user has access to that has the given chapter within it.",
        "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/ReadingListDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/items": {
      "get": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Fetches all reading list items for a given list including rich metadata around series, volume, chapters, and progress",
        "description": "This call is expensive",
        "parameters": [
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListItemDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListItemDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingListItemDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/update-position": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Updates an items position",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListPosition"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListPosition"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListPosition"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/ReadingList/delete-item": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Deletes a list item from the list. Item orders will update as a result.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListPosition"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListPosition"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListPosition"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/ReadingList/remove-read": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Removes all entries that are fully read from the reading list",
        "parameters": [
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/ReadingList/create": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Creates a new List with a unique title. Returns the new ReadingList back",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateReadingListDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateReadingListDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateReadingListDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingListDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingListDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingListDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/update": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Update the properties (title, summary) of a reading list",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingListDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingListDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingListDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/update-by-series": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Adds all chapters from a Series to a reading list",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListBySeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListBySeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListBySeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/ReadingList/update-by-multiple": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Adds all chapters from a list of volumes and chapters to a reading list",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByMultipleDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByMultipleDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByMultipleDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/ReadingList/update-by-multiple-series": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Adds all chapters from a list of series to a reading list",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByMultipleSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByMultipleSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByMultipleSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/ReadingList/update-by-volume": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByVolumeDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByVolumeDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByVolumeDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/ReadingList/update-by-chapter": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByChapterDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByChapterDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReadingListByChapterDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/ReadingList/people": {
      "get": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Returns a list of a given role associated with the reading list",
        "parameters": [
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "role",
            "in": "query",
            "description": "PersonRole",
            "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/ReadingList/all-people": {
      "get": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Returns all people in given roles for a reading list",
        "parameters": [
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "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/ReadingList/next-chapter": {
      "get": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Returns the next chapter within the reading list",
        "parameters": [
          {
            "name": "currentChapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "text/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/prev-chapter": {
      "get": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Returns the prev chapter within the reading list",
        "parameters": [
          {
            "name": "currentChapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "application/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              },
              "text/json": {
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/name-exists": {
      "get": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Checks if a reading list exists with the name",
        "parameters": [
          {
            "name": "name",
            "in": "query",
            "description": "If empty or null, will return true as that is invalid",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/promote-multiple": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Promote/UnPromote multiple reading lists in one go. Will only update the authenticated user's reading lists and will only work if the user has promotion role",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PromoteReadingListsDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/PromoteReadingListsDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/PromoteReadingListsDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/ReadingList/delete-multiple": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Delete multiple reading lists in one go",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteReadingListsDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteReadingListsDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteReadingListsDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/ReadingList/info": {
      "get": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Returns random information about a Reading List",
        "parameters": [
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingListInfoDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingListInfoDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingListInfoDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/ReadingList/export-as-cbl": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Export a Reading List to CBL format",
        "parameters": [
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "asV2",
            "in": "query",
            "description": "",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/ReadingList/regenerate-cover": {
      "post": {
        "tags": [
          "ReadingList"
        ],
        "summary": "Regenerates the cover image for a reading list, you must own the given reading list to do this",
        "parameters": [
          {
            "name": "readingListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/reading-profile/all": {
      "get": {
        "tags": [
          "ReadingProfile"
        ],
        "summary": "Gets all non-implicit reading profiles for a user",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserReadingProfileDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserReadingProfileDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserReadingProfileDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/reading-profile/{libraryId}/{seriesId}": {
      "get": {
        "tags": [
          "ReadingProfile"
        ],
        "summary": "Returns the ReadingProfile that should be applied to the given series, walks up the tree.\nSeries -> Library -> Default",
        "parameters": [
          {
            "name": "libraryId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seriesId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "skipImplicit",
            "in": "query",
            "description": "",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "deviceId",
            "in": "query",
            "description": "Defaults to currently active device",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/reading-profile/series": {
      "get": {
        "tags": [
          "ReadingProfile"
        ],
        "summary": "Returns all Reading Profiles bound to a series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserReadingProfileDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserReadingProfileDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserReadingProfileDto"
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "ReadingProfile"
        ],
        "summary": "Update the implicit reading profile for a series, creates one if none exists",
        "description": "Any modification to the reader settings during reading will create an implicit profile. Use \"update-parent\" to save to the bound series profile.",
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "deviceId",
            "in": "query",
            "description": "Defaults to the currently active device",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserReadingProfileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UserReadingProfileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UserReadingProfileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/reading-profile/library": {
      "get": {
        "tags": [
          "ReadingProfile"
        ],
        "summary": "Returns all the Reading rofiles bound to the library",
        "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/UserReadingProfileDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserReadingProfileDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserReadingProfileDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/reading-profile/create": {
      "post": {
        "tags": [
          "ReadingProfile"
        ],
        "summary": "Creates a new reading profile for the current user",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserReadingProfileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UserReadingProfileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UserReadingProfileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/reading-profile/promote": {
      "post": {
        "tags": [
          "ReadingProfile"
        ],
        "summary": "Promotes the implicit profile to a user profile. Removes the series from other profiles",
        "parameters": [
          {
            "name": "profileId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "deviceId",
            "in": "query",
            "description": "Defaults to the currently active device",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/reading-profile/update-parent": {
      "post": {
        "tags": [
          "ReadingProfile"
        ],
        "summary": "Updates the non-implicit reading profile for the given series, and removes implicit profiles",
        "parameters": [
          {
            "name": "libraryId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "deviceId",
            "in": "query",
            "description": "Defaults to currently active device",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserReadingProfileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UserReadingProfileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UserReadingProfileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/reading-profile": {
      "post": {
        "tags": [
          "ReadingProfile"
        ],
        "summary": "Updates the given reading profile, must belong to the current user",
        "description": "This does not update connected series and libraries.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserReadingProfileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UserReadingProfileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UserReadingProfileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadingProfileDto"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "ReadingProfile"
        ],
        "summary": "Deletes the given profile, requires the profile to belong to the logged-in user",
        "parameters": [
          {
            "name": "profileId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/reading-profile/series/{seriesId}": {
      "post": {
        "tags": [
          "ReadingProfile"
        ],
        "summary": "Sets the reading profile for a given series, removes the old one",
        "parameters": [
          {
            "name": "seriesId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "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"
          }
        }
      },
      "delete": {
        "tags": [
          "ReadingProfile"
        ],
        "summary": "Clears the reading profile for the given series for the currently logged-in user",
        "parameters": [
          {
            "name": "seriesId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/reading-profile/library/{libraryId}": {
      "post": {
        "tags": [
          "ReadingProfile"
        ],
        "summary": "Sets the reading profile for a given library, removes the old one",
        "parameters": [
          {
            "name": "libraryId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "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"
          }
        }
      },
      "delete": {
        "tags": [
          "ReadingProfile"
        ],
        "summary": "Clears the reading profile for the given library for the currently logged-in user",
        "parameters": [
          {
            "name": "libraryId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/reading-profile/bulk": {
      "post": {
        "tags": [
          "ReadingProfile"
        ],
        "summary": "Assigns the reading profile to all passes series, and deletes their implicit profiles",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkSetSeriesProfiles"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkSetSeriesProfiles"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BulkSetSeriesProfiles"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/reading-profile/set-devices": {
      "post": {
        "tags": [
          "ReadingProfile"
        ],
        "summary": "Set the assigned devices for a reading profile",
        "parameters": [
          {
            "name": "profileId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "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/Review/series": {
      "post": {
        "tags": [
          "Review"
        ],
        "summary": "Updates the user's review for a given series",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserReviewDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserReviewDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserReviewDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserReviewDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReviewDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReviewDto"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Review"
        ],
        "summary": "Deletes the user's review for the given series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Review/chapter": {
      "post": {
        "tags": [
          "Review"
        ],
        "summary": "Update the user's review for a given chapter",
        "requestBody": {
          "description": "chapterId must be set",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserReviewDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserReviewDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserReviewDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserReviewDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReviewDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReviewDto"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Review"
        ],
        "summary": "Deletes the user's review for the given chapter",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Review/all": {
      "get": {
        "tags": [
          "Review"
        ],
        "summary": "Returns all reviews for the user. If you are authenticated as the user, will always return data, regardless of ShareReviews setting",
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "description": "User to load, if your own, will bypass RBS and ShareReviews restrictions",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "rating",
            "in": "query",
            "description": "Null to ignore filtering. >= rating",
            "schema": {
              "type": "number",
              "format": "float"
            }
          },
          {
            "name": "filterQuery",
            "in": "query",
            "description": "Null to ignore filtering on Series name",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserReviewExtendedDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserReviewExtendedDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserReviewExtendedDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/scrobble-settings": {
      "get": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Returns all scrobble providers for a user. This list is guaranteed to contain an entry for each currently\nvalid scrobble provider. If the user has none setup, returns the empty default values.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleProviderDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleProviderDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleProviderDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/update-scrobble-settings": {
      "post": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Updates the scrobble settings for a given provider. Libraries are filtered on supported types",
        "parameters": [
          {
            "name": "provider",
            "in": "query",
            "description": "",
            "schema": {
              "$ref": "#/components/schemas/ScrobbleProvider"
            }
          }
        ],
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScrobbleProviderSettingsDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ScrobbleProviderSettingsDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ScrobbleProviderSettingsDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Scrobbling/update-user-scrobble-provider": {
      "post": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Update authentication details for the given provider",
        "description": "Kicks of a sync background job, listen on signalr for when it completes",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateScrobbleProviderDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateScrobbleProviderDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateScrobbleProviderDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Scrobbling/generate-scrobble-events": {
      "post": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Generate scrobble events from history. Should only be ran once per user.",
        "parameters": [
          {
            "name": "scrobbleProvider",
            "in": "query",
            "description": "Members:\n- `0` — Kavita\n- `1` — AniList\n- `2` — Mal\n- `4` — Cbr\n- `5` — Hardcover\n- `6` — MangaBaka",
            "schema": {
              "$ref": "#/components/schemas/ScrobbleProvider"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Scrobbling/generate-scrobble-events-all": {
      "post": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Generate scrobble events from history for all valid providers.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/token-expired": {
      "get": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Checks if the current Scrobbling token for the given Provider has expired for the current user",
        "parameters": [
          {
            "name": "provider",
            "in": "query",
            "description": "",
            "schema": {
              "$ref": "#/components/schemas/ScrobbleProvider"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/expired-tokens": {
      "get": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Returns all expired tokens for the current user",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleProvider"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleProvider"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleProvider"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/scrobble-errors": {
      "get": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Returns all scrobbling errors for the instance",
        "description": "Requires admin",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleErrorDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleErrorDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleErrorDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/clear-errors": {
      "post": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Clears the scrobbling errors table",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Scrobbling/scrobble-events": {
      "post": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Returns the scrobbling history for the user",
        "description": "User must have a valid license",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScrobbleEventFilter"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ScrobbleEventFilter"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ScrobbleEventFilter"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleEventDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleEventDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleEventDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/holds": {
      "get": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Returns all scrobble holds for the current user",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleHoldDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleHoldDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ScrobbleHoldDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/has-hold": {
      "get": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "If there is an active hold on the series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/library-allows-scrobbling": {
      "get": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Does the library the series is in allow scrobbling?",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/add-hold": {
      "post": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Adds a hold against the Series for user's scrobbling",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Scrobbling/remove-hold": {
      "delete": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Remove a hold against the Series for user's scrobbling",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Scrobbling/bulk-remove-events": {
      "post": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Delete the given scrobble events if they belong to that user",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int64"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int64"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int64"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Scrobbling/retry-scrobble": {
      "post": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Attempts to retry Scrobble Events for the current authenticated user (or admin-allowed).",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KavitaPlusAuditEntryDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/KavitaPlusAuditEntryDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/KavitaPlusAuditEntryDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Scrobbling/next-scrobble-time": {
      "get": {
        "tags": [
          "Scrobbling"
        ],
        "summary": "Returns when Scrobbling upload will next execute",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true
                }
              },
              "application/json": {
                "schema": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true
                }
              },
              "text/json": {
                "schema": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true
                }
              }
            }
          }
        }
      }
    },
    "/api/Search/series-for-mangafile": {
      "get": {
        "tags": [
          "Search"
        ],
        "summary": "Returns the series for the MangaFile id. If the user does not have access (shouldn't happen by the UI),\nthen null is returned",
        "parameters": [
          {
            "name": "mangaFileId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Search/series-for-chapter": {
      "get": {
        "tags": [
          "Search"
        ],
        "summary": "Returns the series for the Chapter id. If the user does not have access (shouldn't happen by the UI),\nthen null is returned",
        "parameters": [
          {
            "name": "chapterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Search/search": {
      "get": {
        "tags": [
          "Search"
        ],
        "summary": "Searches against different entities in the system against a query string",
        "parameters": [
          {
            "name": "queryString",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "includeChapterAndFiles",
            "in": "query",
            "description": "Include Chapter and Filenames in the entities. This can slow down the search on larger systems",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResultGroupDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResultGroupDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResultGroupDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Search/chapters-by-series": {
      "get": {
        "tags": [
          "Search"
        ],
        "summary": "Returns all chapters for a given series with localized titles. Used for CBL chapter-level matching.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ChapterDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ChapterDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ChapterDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/v2": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Gets series with the applied Filter",
        "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/SeriesFilterV2Dto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesFilterV2Dto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesFilterV2Dto"
              }
            }
          }
        },
        "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/Series/{seriesId}": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Fetches a Series for a given Id",
        "parameters": [
          {
            "name": "seriesId",
            "in": "path",
            "description": "Series Id to fetch details for",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Series"
        ],
        "summary": "Deletes a series from Kavita",
        "parameters": [
          {
            "name": "seriesId",
            "in": "path",
            "description": "",
            "required": true,
            "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/Series/delete-multiple": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Deletes multiple series from Kavita at once",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Series/volumes": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Returns All volumes for a series with progress information and Chapters",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/VolumeDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/VolumeDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/VolumeDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/volume": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Returns a single Volume with progress information and Chapters",
        "parameters": [
          {
            "name": "volumeId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/chapter": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Returns a single Chapter with progress information",
        "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"
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/update": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Updates the Series",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/recently-added-v2": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Gets all recently added series",
        "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/SeriesFilterV2Dto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesFilterV2Dto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesFilterV2Dto"
              }
            }
          }
        },
        "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/Series/recently-updated-series": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Returns series that were recently updated, like adding or removing a chapter",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/GroupedSeriesDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/GroupedSeriesDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/GroupedSeriesDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/all-v2": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Returns all series for the library",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "userId",
            "in": "query",
            "description": "Optional user id to request the OnDeck for someone else. They must have profile sharing enabled when doing so",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "context",
            "in": "query",
            "description": "",
            "schema": {
              "$ref": "#/components/schemas/QueryContext"
            }
          }
        ],
        "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",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/on-deck": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Fetches series that are on deck aka have progress on them.",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "libraryId",
            "in": "query",
            "description": "Default of 0 meaning all libraries",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "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/Series/remove-from-on-deck": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Removes a series from displaying on deck until the next read event on that series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Series/currently-reading": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Get series a user is currently reading, requires the user to share their profile",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "userId",
            "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/Series/refresh-metadata": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Runs a Cover Image Generation task",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Series/scan": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Scan a series and force each file to be updated. This should be invoked via the User, hence why we force.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Series/analyze": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Run a file analysis on the series.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Series/metadata": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Returns metadata for a given series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesMetadataDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesMetadataDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesMetadataDto"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Update series metadata",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesMetadataDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesMetadataDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSeriesMetadataDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Series/series-by-collection": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Returns all Series grouped by the passed Collection Id with Pagination.",
        "parameters": [
          {
            "name": "collectionId",
            "in": "query",
            "description": "Collection Id to pull series from",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "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/Series/series-by-ids": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Fetches Series for a set of Ids. This will check User for permission access and filter out any Ids that don't exist or\nthe user does not have access to.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesByIdsDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesByIdsDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SeriesByIdsDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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/Series/age-rating": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Get the age rating for the Kavita.Models.Entities.Enums.AgeRating enum value",
        "parameters": [
          {
            "name": "ageRating",
            "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/Series/series-detail": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Get a special DTO for Series Detail page.",
        "description": "Do not rely on this API externally. May change without hesitation.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDetailDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDetailDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeriesDetailDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/related": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Fetches the related series for a given series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "relation",
            "in": "query",
            "description": "Type of Relationship to pull back",
            "schema": {
              "$ref": "#/components/schemas/RelationKind"
            }
          }
        ],
        "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/Series/all-related": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Returns all related series against the passed series Id",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/RelatedSeriesDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RelatedSeriesDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/RelatedSeriesDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/update-related": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Update the relations attached to the Series. Does not generate associated Sequel/Prequel pairs on target series.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRelatedSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRelatedSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRelatedSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Series/external-series-detail": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Returns external series metadata around a Given External Series",
        "parameters": [
          {
            "name": "aniListId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "malId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          },
          {
            "name": "mangaBakaId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalSeriesDetailDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalSeriesDetailDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalSeriesDetailDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/next-expected": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Based on the delta times between when chapters are added, for series that are not Completed/Cancelled/Hiatus, forecast the next\ndate when it will be available.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/NextExpectedChapterDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NextExpectedChapterDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/NextExpectedChapterDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/match": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "Sends a request to Kavita+ API for all potential matches, sorted by relevance",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MatchSeriesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MatchSeriesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MatchSeriesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ExternalSeriesMatchDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ExternalSeriesMatchDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ExternalSeriesMatchDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/update-match": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "This will perform the fix match",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExternalMetadataIdsDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ExternalMetadataIdsDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ExternalMetadataIdsDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Series/dont-match": {
      "post": {
        "tags": [
          "Series"
        ],
        "summary": "When true, will not perform a match and will prevent Kavita from attempting to match/scrobble against this series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "dontMatch",
            "in": "query",
            "description": "",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Series/match-info": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Returns extra information around an existing match (and series) to display on the Match Screen.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/MatchSeriesInfoDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchSeriesInfoDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchSeriesInfoDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Series/series-with-annotations": {
      "get": {
        "tags": [
          "Series"
        ],
        "summary": "Returns all Series that a user has access to",
        "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/Server/clear-cache": {
      "post": {
        "tags": [
          "Server"
        ],
        "summary": "Performs an ad-hoc cleanup of Cache",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Server/cleanup-want-to-read": {
      "post": {
        "tags": [
          "Server"
        ],
        "summary": "Performs an ad-hoc cleanup of Want To Read, by removing want to read series for users, where the series are fully read and in Completed publication status.",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Server/cleanup": {
      "post": {
        "tags": [
          "Server"
        ],
        "summary": "Performs the nightly maintenance work on the Server. Can be heavy.",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Server/backup-db": {
      "post": {
        "tags": [
          "Server"
        ],
        "summary": "Performs an ad-hoc backup of the Database",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Server/analyze-files": {
      "post": {
        "tags": [
          "Server"
        ],
        "summary": "This is a one time task that needs to be ran for v0.7 statistics to work",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Server/server-info-slim": {
      "get": {
        "tags": [
          "Server"
        ],
        "summary": "Returns non-sensitive information about the current system",
        "description": "This is just for the UI and is extremely lightweight",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ServerInfoSlimDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerInfoSlimDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerInfoSlimDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Server/convert-media": {
      "post": {
        "tags": [
          "Server"
        ],
        "summary": "Triggers the scheduling of the convert media job. This will convert all media to the target encoding (except for PNG). Only one job will run at a time.",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Server/logs": {
      "get": {
        "tags": [
          "Server"
        ],
        "summary": "Downloads all the log files via a zip",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Server/check-for-updates": {
      "get": {
        "tags": [
          "Server"
        ],
        "summary": "Checks for updates and pushes an event to the UI",
        "description": "Some users have websocket issues so this is not always reliable to alert the user",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Server/check-update": {
      "get": {
        "tags": [
          "Server"
        ],
        "summary": "Checks for updates, if no updates that are > current version installed, returns null",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateNotificationDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateNotificationDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateNotificationDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Server/check-out-of-date": {
      "get": {
        "tags": [
          "Server"
        ],
        "summary": "Returns how many versions out of date this install is",
        "parameters": [
          {
            "name": "stableOnly",
            "in": "query",
            "description": "Only count Stable releases",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "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"
                }
              }
            }
          }
        }
      }
    },
    "/api/Server/changelog": {
      "get": {
        "tags": [
          "Server"
        ],
        "summary": "Pull the Changelog for Kavita from Github and display",
        "parameters": [
          {
            "name": "count",
            "in": "query",
            "description": "How many releases from the latest to return",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UpdateNotificationDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UpdateNotificationDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UpdateNotificationDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Server/jobs": {
      "get": {
        "tags": [
          "Server"
        ],
        "summary": "Returns a list of reoccurring jobs. Scheduled ad-hoc jobs will not be returned.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/JobDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/JobDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/JobDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Server/media-errors": {
      "get": {
        "tags": [
          "Server"
        ],
        "summary": "Returns a list of issues found during scanning or reading in which files may have corruption or bad metadata (structural metadata)",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MediaErrorDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MediaErrorDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MediaErrorDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Server/clear-media-alerts": {
      "post": {
        "tags": [
          "Server"
        ],
        "summary": "Deletes all media errors",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Server/bust-kavitaplus-cache": {
      "post": {
        "tags": [
          "Server"
        ],
        "summary": "Bust Kavita+ Cache",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Server/sync-themes": {
      "post": {
        "tags": [
          "Server"
        ],
        "summary": "Runs the Sync Themes task",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Server/is-task-running": {
      "get": {
        "tags": [
          "Server"
        ],
        "summary": "Returns true if a task is currently running or has been queued. Can be scoped to a queue, default to the default queue",
        "parameters": [
          {
            "name": "methodName",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "queue",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/base-url": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Returns the base url for this instance (if set)",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Returns the server settings",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Settings"
        ],
        "summary": "Update Server settings",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServerSettingDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ServerSettingDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ServerSettingDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/reset": {
      "post": {
        "tags": [
          "Settings"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/reset-ip-addresses": {
      "post": {
        "tags": [
          "Settings"
        ],
        "summary": "Resets the IP Addresses",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/reset-base-url": {
      "post": {
        "tags": [
          "Settings"
        ],
        "summary": "Resets the Base url",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerSettingDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/is-email-setup": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Is the minimum information setup for Email to work",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/task-frequencies": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "All values allowed for Task Scheduling APIs. A custom cron job is not included. Disabled is not applicable for Cleanup.",
        "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/Settings/library-types": {
      "get": {
        "tags": [
          "Settings"
        ],
        "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/Settings/log-levels": {
      "get": {
        "tags": [
          "Settings"
        ],
        "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/Settings/opds-enabled": {
      "get": {
        "tags": [
          "Settings"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/is-valid-cron": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Is the cron expression valid for Kavita's scheduler",
        "parameters": [
          {
            "name": "cronExpression",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/test-email-url": {
      "post": {
        "tags": [
          "Settings"
        ],
        "summary": "Sends a test email to see if email settings are hooked up correctly",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/EmailTestResultDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailTestResultDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailTestResultDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/metadata-settings": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Get the metadata settings for Kavita+ users.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataSettingsDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataSettingsDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataSettingsDto"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Settings"
        ],
        "summary": "Update the metadata settings for Kavita+ Metadata feature",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataSettingsDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataSettingsDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MetadataSettingsDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataSettingsDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataSettingsDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetadataSettingsDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/run-metadata-mappings": {
      "post": {
        "tags": [
          "Settings"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RunMetadataMappingsRequestDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RunMetadataMappingsRequestDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RunMetadataMappingsRequestDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Settings/import-field-mappings": {
      "post": {
        "tags": [
          "Settings"
        ],
        "summary": "Import field mappings",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImportFieldMappingsDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ImportFieldMappingsDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ImportFieldMappingsDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FieldMappingsImportResultDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FieldMappingsImportResultDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FieldMappingsImportResultDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/oidc": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "Retrieve publicly required configuration regarding Oidc",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/OidcPublicConfigDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OidcPublicConfigDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/OidcPublicConfigDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Settings/reset-external-ids": {
      "post": {
        "tags": [
          "Settings"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Settings/is-valid-authority": {
      "post": {
        "tags": [
          "Settings"
        ],
        "summary": "Validate if the given authority is reachable from the server",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AuthorityValidationDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AuthorityValidationDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AuthorityValidationDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/AuthorityValidationResult"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthorityValidationResult"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthorityValidationResult"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/server/stats": {
      "get": {
        "tags": [
          "Stats"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ServerStatisticsDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerStatisticsDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerStatisticsDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/server/count/publication-status": {
      "get": {
        "tags": [
          "Stats"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PublicationStatusStatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PublicationStatusStatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PublicationStatusStatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/server/count/manga-format": {
      "get": {
        "tags": [
          "Stats"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MangaFormatStatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MangaFormatStatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MangaFormatStatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/popular-decades": {
      "get": {
        "tags": [
          "Stats"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/StatBucketDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/StatBucketDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/StatBucketDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/popular-libraries": {
      "get": {
        "tags": [
          "Stats"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LibraryDtoStatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LibraryDtoStatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LibraryDtoStatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/popular-series": {
      "get": {
        "tags": [
          "Stats"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDtoStatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDtoStatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDtoStatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/popular-reading-list": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Gets the top 5 most popular reading lists. Counts a reading list as active if a user has read at least some",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDtoStatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDtoStatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SeriesDtoStatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/popular-genres": {
      "get": {
        "tags": [
          "Stats"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/GenreTagDtoStatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/GenreTagDtoStatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/GenreTagDtoStatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/popular-tags": {
      "get": {
        "tags": [
          "Stats"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TagDtoStatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TagDtoStatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TagDtoStatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/popular-people": {
      "get": {
        "tags": [
          "Stats"
        ],
        "parameters": [
          {
            "name": "role",
            "in": "query",
            "description": "Members:\n- `3` — Writer\n- `4` — Penciller\n- `5` — Inker\n- `6` — Colorist\n- `7` — Letterer\n- `8` — CoverArtist\n- `9` — Editor\n- `10` — Publisher\n- `11` — Character\n- `12` — Translator\n- `13` — Imprint\n- `14` — Team\n- `15` — Location",
            "schema": {
              "$ref": "#/components/schemas/PersonRole"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonDtoStatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonDtoStatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PersonDtoStatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/most-active-users": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Top 5 most active readers for the given timeframe",
        "parameters": [
          {
            "name": "StartDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "TimeZoneId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "EndDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Libraries",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TopReadDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TopReadDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TopReadDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/server/file-breakdown": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "A breakdown of different files, their size, and format",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FileExtensionBreakdownDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FileExtensionBreakdownDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FileExtensionBreakdownDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/server/file-extension": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Generates a csv of all file paths for a given extension",
        "parameters": [
          {
            "name": "fileExtension",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Stats/reading-counts": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Returns reading history events for a give or all users, broken up by day, and format",
        "parameters": [
          {
            "name": "StartDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "TimeZoneId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "EndDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Libraries",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "userId",
            "in": "query",
            "description": "If 0, defaults to all users, else just userId",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DateTimeStatCountWithFormat"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DateTimeStatCountWithFormat"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DateTimeStatCountWithFormat"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/day-breakdown": {
      "get": {
        "tags": [
          "Stats"
        ],
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DayOfWeekStatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DayOfWeekStatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DayOfWeekStatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/pages-per-year": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Returns a count of pages read per year for a given userId.",
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/words-per-year": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Returns a count of words read per year for a given userId.",
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Int32StatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/files-added-over-time": {
      "get": {
        "tags": [
          "Stats"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DateTimeStatCountWithFormat"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DateTimeStatCountWithFormat"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DateTimeStatCountWithFormat"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/device/client-type": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Returns client type breakdown for the current month",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/DeviceClientBreakdownDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeviceClientBreakdownDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeviceClientBreakdownDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/device/device-type": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Desktop vs Mobile spread over this month",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/StringStatCount"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StringStatCount"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/StringStatCount"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/reading-activity": {
      "get": {
        "tags": [
          "Stats"
        ],
        "parameters": [
          {
            "name": "StartDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "TimeZoneId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "EndDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Libraries",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "year",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "$ref": "#/components/schemas/ReadingActivityGraphEntryDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "$ref": "#/components/schemas/ReadingActivityGraphEntryDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "$ref": "#/components/schemas/ReadingActivityGraphEntryDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/reading-pace": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "",
        "parameters": [
          {
            "name": "StartDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "TimeZoneId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "EndDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Libraries",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "userId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "year",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "booksOnly",
            "in": "query",
            "description": "This API only returns for Books (epub/pdf) and Comics (Image/Archive) regardless of Library type",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingPaceDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingPaceDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadingPaceDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/genre-breakdown": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Returns the top 10 genres that the user likes reading",
        "parameters": [
          {
            "name": "StartDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "TimeZoneId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "EndDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Libraries",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "userId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/StringBreakDownDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StringBreakDownDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/StringBreakDownDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/tag-breakdown": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Returns top 10 tags that user likes reading",
        "parameters": [
          {
            "name": "StartDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "TimeZoneId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "EndDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Libraries",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "userId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/StringBreakDownDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StringBreakDownDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/StringBreakDownDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/page-spread": {
      "get": {
        "tags": [
          "Stats"
        ],
        "parameters": [
          {
            "name": "StartDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "TimeZoneId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "EndDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Libraries",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadStatsDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadStatsDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadStatsDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/word-spread": {
      "get": {
        "tags": [
          "Stats"
        ],
        "parameters": [
          {
            "name": "StartDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "TimeZoneId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "EndDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Libraries",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadStatsDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadStatsDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadStatsDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/favorite-authors": {
      "get": {
        "tags": [
          "Stats"
        ],
        "parameters": [
          {
            "name": "StartDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "TimeZoneId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "EndDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Libraries",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/MostReadAuthorsDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MostReadAuthorsDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/MostReadAuthorsDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/avg-time-by-hour": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Returns the avg time read by hour in the given filter",
        "parameters": [
          {
            "name": "StartDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "TimeZoneId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "EndDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Libraries",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "userId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ReadTimeByHourDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadTimeByHourDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadTimeByHourDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/reads-by-month": {
      "get": {
        "tags": [
          "Stats"
        ],
        "parameters": [
          {
            "name": "StartDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "TimeZoneId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "EndDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Libraries",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/YearMonthGroupingDtoStatCount"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/YearMonthGroupingDtoStatCount"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/YearMonthGroupingDtoStatCount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/total-reads": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Returns the total amount reads in the given filter",
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "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"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/user-stats": {
      "get": {
        "tags": [
          "Stats"
        ],
        "parameters": [
          {
            "name": "StartDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "TimeZoneId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "EndDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Libraries",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProfileStatBarDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProfileStatBarDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProfileStatBarDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/user-read": {
      "get": {
        "tags": [
          "Stats"
        ],
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadStatistics"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadStatistics"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReadStatistics"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/reading-history": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Return a user's reading session history",
        "parameters": [
          {
            "name": "StartDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "TimeZoneId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "EndDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Libraries",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingHistoryItemDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingHistoryItemDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingHistoryItemDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stats/reading-history/series/{seriesId}": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Return the authenticated users reading session history for a given series",
        "parameters": [
          {
            "name": "seriesId",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "tzId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingHistoryItemDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingHistoryItemDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReadingHistoryItemDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stream/dashboard": {
      "get": {
        "tags": [
          "Stream"
        ],
        "summary": "Returns the layout of the user's dashboard",
        "parameters": [
          {
            "name": "visibleOnly",
            "in": "query",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DashboardStreamDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DashboardStreamDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DashboardStreamDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stream/sidenav": {
      "get": {
        "tags": [
          "Stream"
        ],
        "summary": "Return's the user's side nav",
        "parameters": [
          {
            "name": "visibleOnly",
            "in": "query",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SideNavStreamDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SideNavStreamDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SideNavStreamDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stream/external-sources": {
      "get": {
        "tags": [
          "Stream"
        ],
        "summary": "Return's the user's external sources",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ExternalSourceDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ExternalSourceDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ExternalSourceDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Stream/create-external-source": {
      "post": {
        "tags": [
          "Stream"
        ],
        "summary": "Create an external Source",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExternalSourceDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ExternalSourceDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ExternalSourceDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalSourceDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalSourceDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalSourceDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stream/update-external-source": {
      "post": {
        "tags": [
          "Stream"
        ],
        "summary": "Updates an existing external source",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExternalSourceDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ExternalSourceDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ExternalSourceDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalSourceDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalSourceDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalSourceDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stream/external-source-exists": {
      "post": {
        "tags": [
          "Stream"
        ],
        "summary": "Validates the external source by host is unique (for this user)",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExternalSourceDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ExternalSourceDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ExternalSourceDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stream/delete-external-source": {
      "delete": {
        "tags": [
          "Stream"
        ],
        "summary": "Delete's the external source",
        "parameters": [
          {
            "name": "externalSourceId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Stream/add-dashboard-stream": {
      "post": {
        "tags": [
          "Stream"
        ],
        "summary": "Creates a Dashboard Stream from a SmartFilter and adds it to the user's dashboard as visible",
        "parameters": [
          {
            "name": "smartFilterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/DashboardStreamDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DashboardStreamDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/DashboardStreamDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stream/update-dashboard-stream": {
      "post": {
        "tags": [
          "Stream"
        ],
        "summary": "Updates the visibility of a dashboard stream",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DashboardStreamDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DashboardStreamDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DashboardStreamDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Stream/update-dashboard-position": {
      "post": {
        "tags": [
          "Stream"
        ],
        "summary": "Updates the position of a dashboard stream",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateStreamPositionDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateStreamPositionDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateStreamPositionDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Stream/add-sidenav-stream": {
      "post": {
        "tags": [
          "Stream"
        ],
        "summary": "Creates a SideNav Stream from a SmartFilter and adds it to the user's sidenav as visible",
        "parameters": [
          {
            "name": "smartFilterId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SideNavStreamDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SideNavStreamDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SideNavStreamDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stream/add-sidenav-stream-from-external-source": {
      "post": {
        "tags": [
          "Stream"
        ],
        "summary": "Creates a SideNav Stream from a SmartFilter and adds it to the user's sidenav as visible",
        "parameters": [
          {
            "name": "externalSourceId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SideNavStreamDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SideNavStreamDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SideNavStreamDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Stream/update-sidenav-stream": {
      "post": {
        "tags": [
          "Stream"
        ],
        "summary": "Updates the visibility of a dashboard stream",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SideNavStreamDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SideNavStreamDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SideNavStreamDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Stream/update-sidenav-position": {
      "post": {
        "tags": [
          "Stream"
        ],
        "summary": "Updates the position of a dashboard stream",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateStreamPositionDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateStreamPositionDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateStreamPositionDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Stream/bulk-sidenav-stream-visibility": {
      "post": {
        "tags": [
          "Stream"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkUpdateSideNavStreamVisibilityDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkUpdateSideNavStreamVisibilityDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BulkUpdateSideNavStreamVisibilityDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Stream/smart-filter-side-nav-stream": {
      "delete": {
        "tags": [
          "Stream"
        ],
        "summary": "Removes a Smart Filter from a user's SideNav Streams",
        "parameters": [
          {
            "name": "sideNavStreamId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Stream/smart-filter-dashboard-stream": {
      "delete": {
        "tags": [
          "Stream"
        ],
        "summary": "Removes a Smart Filter from a user's Dashboard Streams",
        "parameters": [
          {
            "name": "dashboardStreamId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Tachiyomi/latest-chapter": {
      "get": {
        "tags": [
          "Tachiyomi"
        ],
        "summary": "Given the series Id, this should return the latest chapter that has been fully read.",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/TachiyomiChapterDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TachiyomiChapterDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/TachiyomiChapterDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Tachiyomi/mark-chapter-until-as-read": {
      "post": {
        "tags": [
          "Tachiyomi"
        ],
        "summary": "Marks every chapter that is sorted below the passed number as Read. This will not mark any specials as read.",
        "description": "This is built for Tachiyomi and is not expected to be called by any other place",
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "chapterNumber",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "float"
            }
          },
          {
            "name": "generateReadingSessions",
            "in": "query",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/Theme": {
      "get": {
        "tags": [
          "Theme"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SiteThemeDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SiteThemeDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SiteThemeDto"
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Theme"
        ],
        "summary": "Attempts to delete a theme. If already in use by users, will not allow",
        "parameters": [
          {
            "name": "themeId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DownloadableSiteThemeDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DownloadableSiteThemeDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DownloadableSiteThemeDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Theme/update-default": {
      "post": {
        "tags": [
          "Theme"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDefaultThemeDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDefaultThemeDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDefaultThemeDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Theme/download-content": {
      "get": {
        "tags": [
          "Theme"
        ],
        "summary": "Returns css content to the UI. UI is expected to escape the content",
        "parameters": [
          {
            "name": "themeId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Theme/browse": {
      "get": {
        "tags": [
          "Theme"
        ],
        "summary": "Browse themes that can be used on this server",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DownloadableSiteThemeDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DownloadableSiteThemeDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DownloadableSiteThemeDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Theme/download-theme": {
      "post": {
        "tags": [
          "Theme"
        ],
        "summary": "Downloads a SiteTheme from upstream",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DownloadableSiteThemeDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DownloadableSiteThemeDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DownloadableSiteThemeDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/SiteThemeDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteThemeDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteThemeDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Theme/upload-theme": {
      "post": {
        "tags": [
          "Theme"
        ],
        "summary": "Uploads a new theme file",
        "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/SiteThemeDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteThemeDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteThemeDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Upload/upload-by-url": {
      "post": {
        "tags": [
          "Upload"
        ],
        "summary": "This stores a file (image) in temp directory for use in a cover image replacement flow.\nThis is automatically cleaned up.",
        "requestBody": {
          "description": "Escaped url to download from",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadUrlDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadUrlDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UploadUrlDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Upload/upload-by-file": {
      "post": {
        "tags": [
          "Upload"
        ],
        "summary": "Stages an uploaded image file in the temp directory for use in a cover image replacement flow.\nThis is automatically cleaned up.",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "type": "string",
                    "description": "The image file to stage",
                    "format": "binary"
                  }
                }
              },
              "encoding": {
                "file": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              },
              "application/json": {
                "schema": {
                  "type": "string"
                }
              },
              "text/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/Upload/series": {
      "post": {
        "tags": [
          "Upload"
        ],
        "summary": "Replaces series cover image and locks it with a base64 encoded image",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Upload/collection": {
      "post": {
        "tags": [
          "Upload"
        ],
        "summary": "Replaces collection tag cover image and locks it with a base64 encoded image",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Upload/reading-list": {
      "post": {
        "tags": [
          "Upload"
        ],
        "summary": "Replaces reading list cover image and locks it with a base64 encoded image",
        "description": "This is the only API that can be called by non-admins, but the authenticated user must have a readinglist permission",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Upload/chapter": {
      "post": {
        "tags": [
          "Upload"
        ],
        "summary": "Replaces chapter cover image and locks it with a base64 encoded image. This will update the parent volume's cover image.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Upload/volume": {
      "post": {
        "tags": [
          "Upload"
        ],
        "summary": "Replaces volume cover image and locks it with a base64 encoded image.",
        "description": "This will not update the underlying chapter",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Upload/library": {
      "post": {
        "tags": [
          "Upload"
        ],
        "summary": "Replaces library cover image with a base64 encoded image. If empty string passed, will reset to null.",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Upload/person": {
      "post": {
        "tags": [
          "Upload"
        ],
        "summary": "Replaces person tag cover image and locks it with a base64 encoded image",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Upload/user": {
      "post": {
        "tags": [
          "Upload"
        ],
        "summary": "Replaces user cover image and locks it with a base64 encoded image",
        "description": "You MUST be the user in question",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCoverFileDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Users/delete-user": {
      "delete": {
        "tags": [
          "Users"
        ],
        "parameters": [
          {
            "name": "username",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/Users": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Returns all users of this server",
        "parameters": [
          {
            "name": "includePending",
            "in": "query",
            "description": "This will include pending members",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MemberDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MemberDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MemberDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Users/profile-info": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Get Information about a given user",
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/MemberInfoDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemberInfoDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemberInfoDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Users/has-profile-shared": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Does the requested user have their profile sharing on",
        "parameters": [
          {
            "name": "userId",
            "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/Users/has-reading-progress": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Is there any reading progress on this library",
        "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/Users/has-library-access": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Does the user have access to this library",
        "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/Users/update-preferences": {
      "post": {
        "tags": [
          "Users"
        ],
        "summary": "Update the user preferences",
        "description": "If the user has ReadOnly role, they will not be able to perform this action",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserPreferencesDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UserPreferencesDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UserPreferencesDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserPreferencesDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserPreferencesDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserPreferencesDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Users/get-preferences": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Returns the preferences of the user",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/UserPreferencesDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserPreferencesDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserPreferencesDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Users/names": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Returns a list of the user names within the system",
        "responses": {
          "200": {
            "description": "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/Users/tokens": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Returns all users with tokens registered and their token information. Does not send the tokens.",
        "description": "Kavita+ only",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserTokenInfoDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserTokenInfoDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserTokenInfoDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/Volume": {
      "get": {
        "tags": [
          "Volume"
        ],
        "summary": "Returns the appropriate Volume",
        "parameters": [
          {
            "name": "volumeId",
            "in": "query",
            "description": "",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeDto"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Volume"
        ],
        "summary": "Delete the Volume from the DB",
        "parameters": [
          {
            "name": "volumeId",
            "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/Volume/update": {
      "post": {
        "tags": [
          "Volume"
        ],
        "summary": "Updates the information on the Volume",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateVolumeDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateVolumeDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateVolumeDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/VolumeDto"
                }
              }
            }
          }
        }
      }
    },
    "/api/Volume/multiple": {
      "post": {
        "tags": [
          "Volume"
        ],
        "summary": "Delete multiple Volumes from the DB",
        "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",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "boolean"
                }
              },
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              },
              "text/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    },
    "/api/want-to-read/v2": {
      "post": {
        "tags": [
          "WantToRead"
        ],
        "summary": "Return all Series that are in the current logged in user's Want to Read list, filtered",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "userId",
            "in": "query",
            "description": "Optional user id to request the OnDeck for someone else. They must have profile sharing enabled when doing so",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "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",
            "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/want-to-read": {
      "get": {
        "tags": [
          "WantToRead"
        ],
        "parameters": [
          {
            "name": "seriesId",
            "in": "query",
            "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/want-to-read/add-series": {
      "post": {
        "tags": [
          "WantToRead"
        ],
        "summary": "Given a list of Series Ids, add them to the current logged in user's Want To Read list",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWantToReadDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWantToReadDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWantToReadDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/want-to-read/remove-series": {
      "post": {
        "tags": [
          "WantToRead"
        ],
        "summary": "Given a list of Series Ids, remove them from the current logged in user's Want To Read list",
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWantToReadDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWantToReadDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWantToReadDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ALMediaTitle": {
        "type": "object",
        "properties": {
          "englishTitle": {
            "type": "string",
            "nullable": true
          },
          "romajiTitle": {
            "type": "string",
            "nullable": true
          },
          "nativeTitle": {
            "type": "string",
            "nullable": true
          },
          "preferredTitle": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AgeRating": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8,
          9,
          10,
          11,
          12,
          13,
          14,
          -1
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Unknown\n- `1` — Rating Pending (RatingPending)\n- `2` — Early Childhood (EarlyChildhood)\n- `3` — Everyone\n- `4` — G\n- `5` — Everyone 10+ (Everyone10Plus)\n- `6` — PG\n- `7` — Kids to Adults (KidsToAdults)\n- `8` — Teen\n- `9` — MA15+ (Mature15Plus)\n- `10` — Mature 17+ (Mature17Plus)\n- `11` — M (Mature)\n- `12` — R18+ (R18Plus)\n- `13` — Adults Only 18+ (AdultsOnly)\n- `14` — X18+ (X18Plus)\n- `-1` — Not Applicable (NotApplicable)",
        "format": "int32",
        "x-enum-varnames": [
          "Unknown",
          "RatingPending",
          "EarlyChildhood",
          "Everyone",
          "G",
          "Everyone10Plus",
          "PG",
          "KidsToAdults",
          "Teen",
          "Mature15Plus",
          "Mature17Plus",
          "Mature",
          "R18Plus",
          "AdultsOnly",
          "X18Plus",
          "NotApplicable"
        ],
        "x-enum-descriptions": [
          "Unknown",
          "Rating Pending",
          "Early Childhood",
          "Everyone",
          "G",
          "Everyone 10+",
          "PG",
          "Kids to Adults",
          "Teen",
          "MA15+",
          "Mature 17+",
          "M",
          "R18+",
          "Adults Only 18+",
          "X18+",
          "Not Applicable"
        ]
      },
      "AgeRatingDto": {
        "required": [
          "title"
        ],
        "type": "object",
        "properties": {
          "value": {
            "$ref": "#/components/schemas/AgeRating"
          },
          "title": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AgeRestrictionDto": {
        "required": [
          "ageRating",
          "includeUnknowns"
        ],
        "type": "object",
        "properties": {
          "ageRating": {
            "$ref": "#/components/schemas/AgeRating"
          },
          "includeUnknowns": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "AnnotationDto": {
        "required": [
          "chapterId",
          "libraryId",
          "ownerUserId",
          "seriesId",
          "volumeId",
          "xPath"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "xPath": {
            "type": "string",
            "nullable": true
          },
          "endingXPath": {
            "type": "string",
            "nullable": true
          },
          "selectedText": {
            "type": "string",
            "nullable": true
          },
          "comment": {
            "type": "string",
            "nullable": true
          },
          "commentHtml": {
            "type": "string",
            "nullable": true
          },
          "commentPlainText": {
            "type": "string",
            "nullable": true
          },
          "chapterTitle": {
            "type": "string",
            "nullable": true
          },
          "context": {
            "type": "string",
            "nullable": true
          },
          "highlightCount": {
            "type": "integer",
            "format": "int32"
          },
          "containsSpoiler": {
            "type": "boolean"
          },
          "pageNumber": {
            "type": "integer",
            "format": "int32"
          },
          "selectedSlotIndex": {
            "type": "integer",
            "format": "int32"
          },
          "likes": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "libraryName": {
            "type": "string",
            "nullable": true
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "ownerUserId": {
            "type": "integer",
            "format": "int32"
          },
          "ownerUsername": {
            "type": "string",
            "nullable": true
          },
          "ageRating": {
            "$ref": "#/components/schemas/AgeRating"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "AnnotationFilterDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "statements": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AnnotationFilterStatementDto"
            },
            "nullable": true
          },
          "combination": {
            "$ref": "#/components/schemas/FilterCombination"
          },
          "sortOptions": {
            "$ref": "#/components/schemas/AnnotationSortOptionDto"
          },
          "entityType": {
            "$ref": "#/components/schemas/FilterEntityType"
          },
          "limitTo": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "AnnotationFilterField": {
        "enum": [
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8,
          9
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Owner\n- `2` — Library\n- `3` — Spoiler\n- `4` — HighlightSlot\n- `5` — Selection\n- `6` — Comment\n- `7` — Series\n- `8` — Likes\n- `9` — LikedBy",
        "format": "int32",
        "x-enum-varnames": [
          "Owner",
          "Library",
          "Spoiler",
          "HighlightSlot",
          "Selection",
          "Comment",
          "Series",
          "Likes",
          "LikedBy"
        ],
        "x-enum-descriptions": [
          "Owner",
          "Library",
          "Spoiler",
          "HighlightSlot",
          "Selection",
          "Comment",
          "Series",
          "Likes",
          "LikedBy"
        ]
      },
      "AnnotationFilterStatementDto": {
        "type": "object",
        "properties": {
          "comparison": {
            "$ref": "#/components/schemas/FilterComparison"
          },
          "field": {
            "$ref": "#/components/schemas/AnnotationFilterField"
          },
          "value": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AnnotationSortField": {
        "enum": [
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Owner\n- `2` — Created\n- `3` — LastModified\n- `4` — Color",
        "format": "int32",
        "x-enum-varnames": [
          "Owner",
          "Created",
          "LastModified",
          "Color"
        ],
        "x-enum-descriptions": [
          "Owner",
          "Created",
          "LastModified",
          "Color"
        ]
      },
      "AnnotationSortOptionDto": {
        "type": "object",
        "properties": {
          "sortField": {
            "$ref": "#/components/schemas/AnnotationSortField"
          },
          "isAscending": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ApiUsageDto": {
        "type": "object",
        "properties": {
          "apiName": {
            "$ref": "#/components/schemas/KavitaPlusApiName"
          },
          "lifetimeCount": {
            "type": "integer",
            "format": "int64"
          },
          "last30DaysCount": {
            "type": "integer",
            "format": "int64"
          },
          "dailyBuckets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DailyBucketDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AppUserCollectionDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "promoted": {
            "type": "boolean"
          },
          "ageRating": {
            "$ref": "#/components/schemas/AgeRating"
          },
          "coverImage": {
            "type": "string",
            "nullable": true
          },
          "primaryColor": {
            "type": "string",
            "nullable": true
          },
          "secondaryColor": {
            "type": "string",
            "nullable": true
          },
          "coverImageLocked": {
            "type": "boolean"
          },
          "itemCount": {
            "type": "integer",
            "format": "int32"
          },
          "owner": {
            "type": "string",
            "nullable": true
          },
          "lastSyncUtc": {
            "type": "string",
            "format": "date-time"
          },
          "source": {
            "$ref": "#/components/schemas/ScrobbleProvider"
          },
          "sourceUrl": {
            "type": "string",
            "nullable": true
          },
          "totalSourceCount": {
            "type": "integer",
            "format": "int32"
          },
          "missingSeriesFromSource": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AppUserOpdsPreferences": {
        "type": "object",
        "properties": {
          "embedProgressIndicator": {
            "type": "boolean"
          },
          "includeContinueFrom": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "AppUserSocialPreferences": {
        "type": "object",
        "properties": {
          "shareReviews": {
            "type": "boolean"
          },
          "shareAnnotations": {
            "type": "boolean"
          },
          "viewOtherAnnotations": {
            "type": "boolean"
          },
          "socialLibraries": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "socialMaxAgeRating": {
            "$ref": "#/components/schemas/AgeRating"
          },
          "socialIncludeUnknowns": {
            "type": "boolean"
          },
          "shareProfile": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "AuditLogMatchExternalIdsParamsDto": {
        "type": "object",
        "properties": {
          "aniListId": {
            "type": "integer",
            "format": "int32"
          },
          "malId": {
            "type": "integer",
            "format": "int64"
          },
          "mangaBakaId": {
            "type": "integer",
            "format": "int64"
          },
          "mangaBakaEditionId": {
            "type": "string",
            "nullable": true
          },
          "cbrId": {
            "type": "integer",
            "format": "int32"
          },
          "hardcoverId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "AuditStatus": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Success\n- `1` — Failure\n- `2` — Info",
        "format": "int32",
        "x-enum-varnames": [
          "Success",
          "Failure",
          "Info"
        ],
        "x-enum-descriptions": [
          "Success",
          "Failure",
          "Info"
        ]
      },
      "AuditSubjectType": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Series\n- `1` — Person\n- `2` — Collection\n- `3` — Chapter\n- `4` — Global\n- `5` — Volume",
        "format": "int32",
        "x-enum-varnames": [
          "Series",
          "Person",
          "Collection",
          "Chapter",
          "Global",
          "Volume"
        ],
        "x-enum-descriptions": [
          "Series",
          "Person",
          "Collection",
          "Chapter",
          "Global",
          "Volume"
        ]
      },
      "AuthKeyDto": {
        "required": [
          "key",
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "key": {
            "type": "string",
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "createdAtUtc": {
            "type": "string",
            "format": "date-time"
          },
          "expiresAtUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lastAccessedAtUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "provider": {
            "$ref": "#/components/schemas/AuthKeyProvider"
          }
        },
        "additionalProperties": false
      },
      "AuthKeyExpiresAtDto": {
        "required": [
          "expiresAt"
        ],
        "type": "object",
        "properties": {
          "expiresAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AuthKeyProvider": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "description": "Members:\n- `0` — User\n- `1` — System",
        "format": "int32",
        "x-enum-varnames": [
          "User",
          "System"
        ],
        "x-enum-descriptions": [
          "User",
          "System"
        ]
      },
      "AuthenticationType": {
        "enum": [
          0,
          1,
          2,
          3
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Unknown\n- `1` — JWT\n- `2` — AuthKey\n- `3` — OIDC",
        "format": "int32",
        "x-enum-varnames": [
          "Unknown",
          "JWT",
          "AuthKey",
          "OIDC"
        ],
        "x-enum-descriptions": [
          "Unknown",
          "JWT",
          "AuthKey",
          "OIDC"
        ]
      },
      "AuthorChapterDto": {
        "type": "object",
        "properties": {
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AuthorityValidationDto": {
        "type": "object",
        "properties": {
          "authority": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AuthorityValidationResult": {
        "enum": [
          0,
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Success\n- `1` — InvalidAuthority\n- `2` — Failure\n- `3` — NotApplicable\n- `4` — MissingHttps",
        "format": "int32",
        "x-enum-varnames": [
          "Success",
          "InvalidAuthority",
          "Failure",
          "NotApplicable",
          "MissingHttps"
        ],
        "x-enum-descriptions": [
          "Success",
          "InvalidAuthority",
          "Failure",
          "NotApplicable",
          "MissingHttps"
        ]
      },
      "BookChapterItem": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "nullable": true
          },
          "part": {
            "type": "string",
            "nullable": true
          },
          "page": {
            "type": "integer",
            "format": "int32"
          },
          "children": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookChapterItem"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BookInfoDto": {
        "type": "object",
        "properties": {
          "bookTitle": {
            "type": "string",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesFormat": {
            "$ref": "#/components/schemas/MangaFormat"
          },
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "chapterNumber": {
            "type": "string",
            "nullable": true
          },
          "volumeNumber": {
            "type": "string",
            "nullable": true
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "pages": {
            "type": "integer",
            "format": "int32"
          },
          "isSpecial": {
            "type": "boolean"
          },
          "chapterTitle": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BookPageLayoutMode": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Default\n- `1` — 1 Column (Column1)\n- `2` — 2 Column (Column2)",
        "format": "int32",
        "x-enum-varnames": [
          "Default",
          "Column1",
          "Column2"
        ],
        "x-enum-descriptions": [
          "Default",
          "1 Column",
          "2 Column"
        ]
      },
      "BookmarkDto": {
        "required": [
          "chapterId",
          "page",
          "seriesId",
          "volumeId"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "page": {
            "type": "integer",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "imageOffset": {
            "type": "integer",
            "format": "int32"
          },
          "xPath": {
            "type": "string",
            "nullable": true
          },
          "series": {
            "$ref": "#/components/schemas/SeriesDto"
          },
          "chapterTitle": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BookmarkInfoDto": {
        "type": "object",
        "properties": {
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "seriesFormat": {
            "$ref": "#/components/schemas/MangaFormat"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryType": {
            "$ref": "#/components/schemas/LibraryType"
          },
          "pages": {
            "type": "integer",
            "format": "int32"
          },
          "pageDimensions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FileDimensionDto"
            },
            "nullable": true
          },
          "doublePairs": {
            "type": "object",
            "additionalProperties": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BookmarkSearchResultDto": {
        "type": "object",
        "properties": {
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "localizedSeriesName": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BreakPoint": {
        "enum": [
          0,
          1,
          2,
          3
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Never\n- `1` — Mobile\n- `2` — Tablet\n- `3` — Desktop",
        "format": "int32",
        "x-enum-varnames": [
          "Never",
          "Mobile",
          "Tablet",
          "Desktop"
        ],
        "x-enum-descriptions": [
          "Never",
          "Mobile",
          "Tablet",
          "Desktop"
        ]
      },
      "BrowseGenreDto": {
        "required": [
          "title"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "seriesCount": {
            "type": "integer",
            "format": "int32"
          },
          "chapterCount": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BrowsePersonDto": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "coverImageLocked": {
            "type": "boolean"
          },
          "primaryColor": {
            "type": "string",
            "nullable": true
          },
          "secondaryColor": {
            "type": "string",
            "nullable": true
          },
          "coverImage": {
            "type": "string",
            "nullable": true
          },
          "aliases": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "asin": {
            "type": "string",
            "nullable": true
          },
          "aniListId": {
            "type": "integer",
            "format": "int32"
          },
          "malId": {
            "type": "integer",
            "format": "int64"
          },
          "hardcoverId": {
            "type": "string",
            "nullable": true
          },
          "webLinks": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "roles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonRole"
            },
            "nullable": true
          },
          "seriesCount": {
            "type": "integer",
            "format": "int32"
          },
          "chapterCount": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BrowseTagDto": {
        "required": [
          "title"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "seriesCount": {
            "type": "integer",
            "format": "int32"
          },
          "chapterCount": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BulkActionDto": {
        "type": "object",
        "properties": {
          "ids": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "force": {
            "type": "boolean",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BulkChapterSizeRequest": {
        "type": "object",
        "properties": {
          "chapterIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BulkReadingListSizeRequest": {
        "type": "object",
        "properties": {
          "readingListIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BulkRemoveBookmarkForSeriesDto": {
        "type": "object",
        "properties": {
          "seriesIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BulkSeriesSizeRequest": {
        "type": "object",
        "properties": {
          "seriesIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BulkSetSeriesProfiles": {
        "type": "object",
        "properties": {
          "profileIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "seriesIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BulkUpdateSideNavStreamVisibilityDto": {
        "required": [
          "ids",
          "visibility"
        ],
        "type": "object",
        "properties": {
          "ids": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "visibility": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "BulkVolumeSizeRequest": {
        "type": "object",
        "properties": {
          "volumeIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CancelKavitaPlusLicenseDto": {
        "required": [
          "email"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "nullable": true
          },
          "comment": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CblBookResult": {
        "type": "object",
        "properties": {
          "order": {
            "type": "integer",
            "format": "int32"
          },
          "series": {
            "type": "string",
            "nullable": true
          },
          "volume": {
            "type": "string",
            "nullable": true
          },
          "number": {
            "type": "string",
            "nullable": true
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "readingListName": {
            "type": "string",
            "nullable": true
          },
          "reason": {
            "$ref": "#/components/schemas/CblImportReason"
          },
          "matchTier": {
            "$ref": "#/components/schemas/CblMatchTier"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterTitle": {
            "type": "string",
            "nullable": true
          },
          "matchedSeriesName": {
            "type": "string",
            "nullable": true
          },
          "libraryType": {
            "$ref": "#/components/schemas/LibraryType"
          },
          "chapterNumber": {
            "type": "string",
            "nullable": true
          },
          "candidates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CblSeriesCandidate"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CblFinalizeRequestDto": {
        "type": "object",
        "properties": {
          "fileName": {
            "type": "string",
            "nullable": true
          },
          "decisions": {
            "$ref": "#/components/schemas/CblImportDecisions"
          },
          "provider": {
            "$ref": "#/components/schemas/ReadingListProvider"
          },
          "repoPath": {
            "type": "string",
            "nullable": true
          },
          "downloadUrl": {
            "type": "string",
            "nullable": true
          },
          "sha": {
            "type": "string",
            "nullable": true
          },
          "promote": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "CblImportDecisions": {
        "type": "object",
        "properties": {
          "itemResolutions": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/CblItemDecision"
            },
            "nullable": true
          },
          "saveAsRemapRules": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "CblImportReason": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8,
          9
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Chapter missing (ChapterMissing)\n- `1` — Volume missing (VolumeMissing)\n- `2` — Series missing (SeriesMissing)\n- `3` — Name Conflict (NameConflict)\n- `4` — All Series Missing (AllSeriesMissing)\n- `5` — Empty File (EmptyFile)\n- `6` — Series Collision (SeriesCollision)\n- `7` — All Chapters Missing (AllChapterMissing)\n- `8` — Success\n- `9` — Invalid File (InvalidFile)",
        "format": "int32",
        "x-enum-varnames": [
          "ChapterMissing",
          "VolumeMissing",
          "SeriesMissing",
          "NameConflict",
          "AllSeriesMissing",
          "EmptyFile",
          "SeriesCollision",
          "AllChapterMissing",
          "Success",
          "InvalidFile"
        ],
        "x-enum-descriptions": [
          "Chapter missing",
          "Volume missing",
          "Series missing",
          "Name Conflict",
          "All Series Missing",
          "Empty File",
          "Series Collision",
          "All Chapters Missing",
          "Success",
          "Invalid File"
        ]
      },
      "CblImportResult": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Fail\n- `1` — Partial\n- `2` — Success",
        "format": "int32",
        "x-enum-varnames": [
          "Fail",
          "Partial",
          "Success"
        ],
        "x-enum-descriptions": [
          "Fail",
          "Partial",
          "Success"
        ]
      },
      "CblImportSummaryDto": {
        "type": "object",
        "properties": {
          "cblName": {
            "type": "string",
            "nullable": true
          },
          "fileName": {
            "type": "string",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CblBookResult"
            },
            "nullable": true
          },
          "success": {
            "$ref": "#/components/schemas/CblImportResult"
          },
          "successfulInserts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CblBookResult"
            },
            "nullable": true
          },
          "isUpdate": {
            "type": "boolean"
          },
          "readingListId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "CblItemDecision": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "CblMatchTier": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          -1
        ],
        "type": "integer",
        "description": "Members:\n- `0` — RemapRule\n- `1` — ExternalId\n- `2` — ExactName\n- `3` — ComicVineNaming\n- `4` — ArticleStripped\n- `5` — ReprintStripped\n- `6` — AlternateSeries\n- `7` — UserDecision\n- `-1` — Unmatched",
        "format": "int32",
        "x-enum-varnames": [
          "RemapRule",
          "ExternalId",
          "ExactName",
          "ComicVineNaming",
          "ArticleStripped",
          "ReprintStripped",
          "AlternateSeries",
          "UserDecision",
          "Unmatched"
        ],
        "x-enum-descriptions": [
          "RemapRule",
          "ExternalId",
          "ExactName",
          "ComicVineNaming",
          "ArticleStripped",
          "ReprintStripped",
          "AlternateSeries",
          "UserDecision",
          "Unmatched"
        ]
      },
      "CblReValidateRequestDto": {
        "type": "object",
        "properties": {
          "fileName": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CblRemapRuleKind": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Series\n- `1` — Volume\n- `2` — Chapter",
        "format": "int32",
        "x-enum-varnames": [
          "Series",
          "Volume",
          "Chapter"
        ],
        "x-enum-descriptions": [
          "Series",
          "Volume",
          "Chapter"
        ]
      },
      "CblRepoBrowseResultDto": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CblRepoItemDto"
            },
            "nullable": true
          },
          "rateLimitDto": {
            "$ref": "#/components/schemas/GithubRateLimitDto"
          },
          "fromCache": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "CblRepoImportRequestDto": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CblRepoItemDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CblRepoItemDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "path": {
            "type": "string",
            "nullable": true
          },
          "isDirectory": {
            "type": "boolean"
          },
          "sha": {
            "type": "string",
            "nullable": true
          },
          "size": {
            "type": "integer",
            "format": "int64"
          },
          "downloadUrl": {
            "type": "string",
            "nullable": true
          },
          "existingReadingListId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "alreadySynced": {
            "type": "boolean",
            "readOnly": true
          }
        },
        "additionalProperties": false
      },
      "CblSavedFileDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "fileName": {
            "type": "string",
            "nullable": true
          },
          "provider": {
            "$ref": "#/components/schemas/ReadingListProvider"
          },
          "repoPath": {
            "type": "string",
            "nullable": true
          },
          "downloadUrl": {
            "type": "string",
            "nullable": true
          },
          "sha": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CblSeriesCandidate": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesName": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ChangeEmailOnLicenseDto": {
        "required": [
          "newEmail",
          "oldEmail"
        ],
        "type": "object",
        "properties": {
          "oldEmail": {
            "type": "string",
            "nullable": true
          },
          "newEmail": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ChapterDetailPlusDto": {
        "type": "object",
        "properties": {
          "rating": {
            "type": "number",
            "format": "float"
          },
          "hasBeenRated": {
            "type": "boolean"
          },
          "reviews": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UserReviewDto"
            },
            "nullable": true
          },
          "ratings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RatingDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ChapterDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "range": {
            "type": "string",
            "nullable": true
          },
          "number": {
            "type": "string",
            "nullable": true,
            "deprecated": true
          },
          "minNumber": {
            "type": "number",
            "format": "float"
          },
          "maxNumber": {
            "type": "number",
            "format": "float"
          },
          "sortOrder": {
            "type": "number",
            "format": "float"
          },
          "pages": {
            "type": "integer",
            "format": "int32"
          },
          "isSpecial": {
            "type": "boolean"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "files": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MangaFileDto"
            },
            "nullable": true
          },
          "pagesRead": {
            "type": "integer",
            "format": "int32"
          },
          "totalReads": {
            "type": "integer",
            "format": "int32"
          },
          "lastReadingProgressUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastReadingProgress": {
            "type": "string",
            "format": "date-time"
          },
          "coverImageLocked": {
            "type": "boolean"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "releaseDate": {
            "type": "string",
            "format": "date-time"
          },
          "titleName": {
            "type": "string",
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "ageRating": {
            "$ref": "#/components/schemas/AgeRating"
          },
          "wordCount": {
            "type": "integer",
            "format": "int64"
          },
          "volumeTitle": {
            "type": "string",
            "nullable": true
          },
          "minHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "maxHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "avgHoursToRead": {
            "type": "number",
            "format": "float"
          },
          "webLinks": {
            "type": "string",
            "nullable": true
          },
          "isbn": {
            "type": "string",
            "nullable": true
          },
          "writers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "coverArtists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "publishers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "characters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "pencillers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "inkers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "imprints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "colorists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "letterers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "editors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "translators": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "teams": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "locations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "genres": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GenreTagDto"
            },
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TagDto"
            },
            "nullable": true
          },
          "publicationStatus": {
            "$ref": "#/components/schemas/PublicationStatus"
          },
          "language": {
            "type": "string",
            "nullable": true
          },
          "count": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int32"
          },
          "languageLocked": {
            "type": "boolean"
          },
          "summaryLocked": {
            "type": "boolean"
          },
          "ageRatingLocked": {
            "type": "boolean"
          },
          "publicationStatusLocked": {
            "type": "boolean"
          },
          "genresLocked": {
            "type": "boolean"
          },
          "tagsLocked": {
            "type": "boolean"
          },
          "writerLocked": {
            "type": "boolean"
          },
          "characterLocked": {
            "type": "boolean"
          },
          "coloristLocked": {
            "type": "boolean"
          },
          "editorLocked": {
            "type": "boolean"
          },
          "inkerLocked": {
            "type": "boolean"
          },
          "imprintLocked": {
            "type": "boolean"
          },
          "lettererLocked": {
            "type": "boolean"
          },
          "pencillerLocked": {
            "type": "boolean"
          },
          "publisherLocked": {
            "type": "boolean"
          },
          "translatorLocked": {
            "type": "boolean"
          },
          "teamLocked": {
            "type": "boolean"
          },
          "locationLocked": {
            "type": "boolean"
          },
          "coverArtistLocked": {
            "type": "boolean"
          },
          "releaseDateLocked": {
            "type": "boolean"
          },
          "titleNameLocked": {
            "type": "boolean"
          },
          "sortOrderLocked": {
            "type": "boolean"
          },
          "coverImage": {
            "type": "string",
            "nullable": true
          },
          "primaryColor": {
            "type": "string",
            "nullable": true
          },
          "secondaryColor": {
            "type": "string",
            "nullable": true
          },
          "format": {
            "$ref": "#/components/schemas/MangaFormat"
          },
          "aniListId": {
            "type": "integer",
            "format": "int32"
          },
          "malId": {
            "type": "integer",
            "format": "int64"
          },
          "hardcoverId": {
            "type": "integer",
            "format": "int32"
          },
          "metronId": {
            "type": "integer",
            "format": "int64"
          },
          "comicVineId": {
            "type": "string",
            "nullable": true
          },
          "mangaBakaId": {
            "type": "integer",
            "format": "int64"
          },
          "cbrId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ChapterInfoDto": {
        "type": "object",
        "properties": {
          "chapterNumber": {
            "type": "string",
            "nullable": true
          },
          "volumeNumber": {
            "type": "string",
            "nullable": true
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "seriesFormat": {
            "$ref": "#/components/schemas/MangaFormat"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryType": {
            "$ref": "#/components/schemas/LibraryType"
          },
          "chapterTitle": {
            "type": "string",
            "nullable": true
          },
          "pages": {
            "type": "integer",
            "format": "int32"
          },
          "fileName": {
            "type": "string",
            "nullable": true
          },
          "isSpecial": {
            "type": "boolean"
          },
          "subtitle": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "seriesTotalPages": {
            "type": "integer",
            "format": "int32"
          },
          "seriesTotalPagesRead": {
            "type": "integer",
            "format": "int32"
          },
          "pageDimensions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FileDimensionDto"
            },
            "nullable": true
          },
          "doublePairs": {
            "type": "object",
            "additionalProperties": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CharacterRole": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Main\n- `1` — Supporting\n- `2` — Background",
        "format": "int32",
        "x-enum-varnames": [
          "Main",
          "Supporting",
          "Background"
        ],
        "x-enum-descriptions": [
          "Main",
          "Supporting",
          "Background"
        ]
      },
      "CheckForFilesInFolderRootsDto": {
        "type": "object",
        "properties": {
          "roots": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ClientDeviceDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "friendlyName": {
            "type": "string",
            "nullable": true
          },
          "uiFingerprint": {
            "type": "string",
            "nullable": true
          },
          "currentClientInfo": {
            "$ref": "#/components/schemas/ClientInfoDto"
          },
          "firstSeenUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastSeenUtc": {
            "type": "string",
            "format": "date-time"
          },
          "ownerUsername": {
            "type": "string",
            "nullable": true
          },
          "ownerUserId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ClientDevicePlatform": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Unknown\n- `1` — Windows\n- `2` — macOS (MacOs)\n- `3` — IOs (Ios)\n- `4` — Linux\n- `5` — Android",
        "format": "int32",
        "x-enum-varnames": [
          "Unknown",
          "Windows",
          "MacOs",
          "Ios",
          "Linux",
          "Android"
        ],
        "x-enum-descriptions": [
          "Unknown",
          "Windows",
          "macOS",
          "IOs",
          "Linux",
          "Android"
        ]
      },
      "ClientDeviceType": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5,
          6
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Unknown\n- `1` — Web Browser (WebBrowser)\n- `2` — Web App (WebApp)\n- `3` — KOReader (KoReader)\n- `4` — Panels\n- `5` — Librera\n- `6` — OPDS Client (OpdsClient)",
        "format": "int32",
        "x-enum-varnames": [
          "Unknown",
          "WebBrowser",
          "WebApp",
          "KoReader",
          "Panels",
          "Librera",
          "OpdsClient"
        ],
        "x-enum-descriptions": [
          "Unknown",
          "Web Browser",
          "Web App",
          "KOReader",
          "Panels",
          "Librera",
          "OPDS Client"
        ]
      },
      "ClientDeviceTypeStatCount": {
        "type": "object",
        "properties": {
          "value": {
            "$ref": "#/components/schemas/ClientDeviceType"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "ClientInfoDto": {
        "type": "object",
        "properties": {
          "userAgent": {
            "type": "string",
            "nullable": true
          },
          "ipAddress": {
            "type": "string",
            "nullable": true
          },
          "authType": {
            "$ref": "#/components/schemas/AuthenticationType"
          },
          "clientType": {
            "$ref": "#/components/schemas/ClientDeviceType"
          },
          "appVersion": {
            "type": "string",
            "nullable": true
          },
          "browser": {
            "type": "string",
            "nullable": true
          },
          "browserVersion": {
            "type": "string",
            "nullable": true
          },
          "platform": {
            "$ref": "#/components/schemas/ClientDevicePlatform"
          },
          "deviceType": {
            "type": "string",
            "nullable": true
          },
          "screenWidth": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "screenHeight": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "orientation": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CollectionTagBulkAddDto": {
        "type": "object",
        "properties": {
          "collectionTagId": {
            "type": "integer",
            "format": "int32"
          },
          "collectionTagTitle": {
            "type": "string",
            "nullable": true
          },
          "seriesIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ColorScapeDto": {
        "type": "object",
        "properties": {
          "primary": {
            "type": "string",
            "nullable": true
          },
          "secondary": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ConfirmEmailDto": {
        "required": [
          "email",
          "password",
          "token",
          "username"
        ],
        "type": "object",
        "properties": {
          "email": {
            "minLength": 1,
            "type": "string"
          },
          "token": {
            "minLength": 1,
            "type": "string"
          },
          "password": {
            "maxLength": 256,
            "minLength": 6,
            "type": "string"
          },
          "username": {
            "minLength": 1,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "ConfirmEmailUpdateDto": {
        "required": [
          "email",
          "token"
        ],
        "type": "object",
        "properties": {
          "email": {
            "minLength": 1,
            "type": "string"
          },
          "token": {
            "minLength": 1,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "ConfirmMigrationEmailDto": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "nullable": true
          },
          "token": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ConfirmPasswordResetDto": {
        "required": [
          "email",
          "password",
          "token"
        ],
        "type": "object",
        "properties": {
          "email": {
            "minLength": 1,
            "type": "string"
          },
          "token": {
            "minLength": 1,
            "type": "string"
          },
          "password": {
            "maxLength": 256,
            "minLength": 6,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "ConflictResolution": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Manual\n- `1` — Keep\n- `2` — Replace",
        "format": "int32",
        "x-enum-varnames": [
          "Manual",
          "Keep",
          "Replace"
        ],
        "x-enum-descriptions": [
          "Manual",
          "Keep",
          "Replace"
        ]
      },
      "CopySettingsFromLibraryDto": {
        "type": "object",
        "properties": {
          "sourceLibraryId": {
            "type": "integer",
            "format": "int32"
          },
          "targetLibraryIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "includeType": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "CoverImageSize": {
        "enum": [
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Default\n- `2` — Medium\n- `3` — Large\n- `4` — XLarge",
        "format": "int32",
        "x-enum-varnames": [
          "Default",
          "Medium",
          "Large",
          "XLarge"
        ],
        "x-enum-descriptions": [
          "Default",
          "Medium",
          "Large",
          "XLarge"
        ]
      },
      "CreateEmailDeviceDto": {
        "required": [
          "emailAddress",
          "name",
          "platform"
        ],
        "type": "object",
        "properties": {
          "name": {
            "minLength": 1,
            "type": "string"
          },
          "platform": {
            "$ref": "#/components/schemas/EmailDevicePlatform"
          },
          "emailAddress": {
            "minLength": 1,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "CreatePersonalToCDto": {
        "required": [
          "chapterId",
          "libraryId",
          "pageNumber",
          "seriesId",
          "title",
          "volumeId"
        ],
        "type": "object",
        "properties": {
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "pageNumber": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "bookScrollId": {
            "type": "string",
            "nullable": true
          },
          "selectedText": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CreateReadingListDto": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CreateRemapRuleDto": {
        "type": "object",
        "properties": {
          "cblSeriesName": {
            "type": "string",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "cblVolume": {
            "type": "string",
            "nullable": true
          },
          "cblNumber": {
            "type": "string",
            "nullable": true
          },
          "volumeId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "chapterId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DailyBucketDto": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "format": "date"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "DashboardStreamDto": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "isProvided": {
            "type": "boolean"
          },
          "order": {
            "type": "integer",
            "format": "int32"
          },
          "smartFilterEncoded": {
            "type": "string",
            "nullable": true
          },
          "smartFilterId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "streamType": {
            "$ref": "#/components/schemas/DashboardStreamType"
          },
          "visible": {
            "type": "boolean"
          },
          "entityType": {
            "$ref": "#/components/schemas/FilterEntityType"
          }
        },
        "additionalProperties": false
      },
      "DashboardStreamType": {
        "enum": [
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "description": "Members:\n- `1` — OnDeck\n- `2` — RecentlyUpdated\n- `3` — NewlyAdded\n- `4` — SmartFilter",
        "format": "int32",
        "x-enum-varnames": [
          "OnDeck",
          "RecentlyUpdated",
          "NewlyAdded",
          "SmartFilter"
        ],
        "x-enum-descriptions": [
          "OnDeck",
          "RecentlyUpdated",
          "NewlyAdded",
          "SmartFilter"
        ]
      },
      "DateTimeStatCountWithFormat": {
        "type": "object",
        "properties": {
          "value": {
            "type": "string",
            "format": "date-time"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          },
          "format": {
            "$ref": "#/components/schemas/MangaFormat"
          }
        },
        "additionalProperties": false
      },
      "DayOfWeek": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5,
          6
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Sunday\n- `1` — Monday\n- `2` — Tuesday\n- `3` — Wednesday\n- `4` — Thursday\n- `5` — Friday\n- `6` — Saturday",
        "format": "int32",
        "x-enum-varnames": [
          "Sunday",
          "Monday",
          "Tuesday",
          "Wednesday",
          "Thursday",
          "Friday",
          "Saturday"
        ],
        "x-enum-descriptions": [
          "Sunday",
          "Monday",
          "Tuesday",
          "Wednesday",
          "Thursday",
          "Friday",
          "Saturday"
        ]
      },
      "DayOfWeekStatCount": {
        "type": "object",
        "properties": {
          "value": {
            "$ref": "#/components/schemas/DayOfWeek"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "DecodeFilterDto": {
        "type": "object",
        "properties": {
          "encodedFilter": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DeleteChaptersDto": {
        "type": "object",
        "properties": {
          "chapterIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DeleteCollectionsDto": {
        "required": [
          "collectionIds"
        ],
        "type": "object",
        "properties": {
          "collectionIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            }
          }
        },
        "additionalProperties": false
      },
      "DeleteReadingListsDto": {
        "required": [
          "readingListIds"
        ],
        "type": "object",
        "properties": {
          "readingListIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            }
          }
        },
        "additionalProperties": false
      },
      "DeleteSeriesDto": {
        "type": "object",
        "properties": {
          "seriesIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DeviceClientBreakdownDto": {
        "type": "object",
        "properties": {
          "records": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClientDeviceTypeStatCount"
            },
            "nullable": true
          },
          "totalCount": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "DirectoryDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "fullPath": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DownloadBookmarkDto": {
        "required": [
          "bookmarks"
        ],
        "type": "object",
        "properties": {
          "bookmarks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookmarkDto"
            }
          }
        },
        "additionalProperties": false
      },
      "DownloadableSiteThemeDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "cssUrl": {
            "type": "string",
            "nullable": true
          },
          "cssFile": {
            "type": "string",
            "nullable": true
          },
          "previewUrls": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "alreadyDownloaded": {
            "type": "boolean"
          },
          "sha": {
            "type": "string",
            "nullable": true
          },
          "path": {
            "type": "string",
            "nullable": true
          },
          "author": {
            "type": "string",
            "nullable": true
          },
          "lastCompatibleVersion": {
            "type": "string",
            "nullable": true
          },
          "isCompatible": {
            "type": "boolean"
          },
          "description": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "EditionEntryType": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Chapter\n- `1` — Volume\n- `2` — Other",
        "format": "int32",
        "x-enum-varnames": [
          "Chapter",
          "Volume",
          "Other"
        ],
        "x-enum-descriptions": [
          "Chapter",
          "Volume",
          "Other"
        ]
      },
      "EmailDeviceDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "emailAddress": {
            "type": "string",
            "nullable": true
          },
          "platform": {
            "$ref": "#/components/schemas/EmailDevicePlatform"
          }
        },
        "additionalProperties": false
      },
      "EmailDevicePlatform": {
        "enum": [
          0,
          1,
          2,
          3
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Custom\n- `1` — PocketBook\n- `2` — Kindle\n- `3` — Kobo",
        "format": "int32",
        "x-enum-varnames": [
          "Custom",
          "PocketBook",
          "Kindle",
          "Kobo"
        ],
        "x-enum-descriptions": [
          "Custom",
          "PocketBook",
          "Kindle",
          "Kobo"
        ]
      },
      "EmailHistoryDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int64"
          },
          "sent": {
            "type": "boolean"
          },
          "sendDate": {
            "type": "string",
            "format": "date-time"
          },
          "emailTemplate": {
            "type": "string",
            "nullable": true
          },
          "errorMessage": {
            "type": "string",
            "nullable": true
          },
          "toUserName": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "EmailTestResultDto": {
        "type": "object",
        "properties": {
          "successful": {
            "type": "boolean"
          },
          "errorMessage": {
            "type": "string",
            "nullable": true
          },
          "emailAddress": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "EncodeFormat": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "description": "Members:\n- `0` — PNG\n- `1` — WebP (WEBP)\n- `2` — AVIF",
        "format": "int32",
        "x-enum-varnames": [
          "PNG",
          "WEBP",
          "AVIF"
        ],
        "x-enum-descriptions": [
          "PNG",
          "WebP",
          "AVIF"
        ]
      },
      "EpubFontDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "family": {
            "type": "string",
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "provider": {
            "$ref": "#/components/schemas/FontProvider"
          },
          "fileName": {
            "type": "string",
            "nullable": true
          },
          "style": {
            "type": "string",
            "nullable": true
          },
          "weight": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ExternalChapterDto": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "nullable": true
          },
          "issueNumber": {
            "type": "string",
            "nullable": true
          },
          "criticRating": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "userRating": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "writers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "artists": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "releaseDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "publisher": {
            "type": "string",
            "nullable": true
          },
          "coverImageUrl": {
            "type": "string",
            "nullable": true
          },
          "issueUrl": {
            "type": "string",
            "nullable": true
          },
          "hardcoverId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "mangaBakaWorkId": {
            "type": "string",
            "nullable": true
          },
          "criticReviews": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UserReviewDto"
            },
            "nullable": true
          },
          "userReviews": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UserReviewDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ExternalCoverImageType": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Series\n- `1` — Volume\n- `2` — VolumeBack\n- `3` — Chapter\n- `4` — Issue\n- `5` — Banner\n- `6` — Season\n- `7` — Audiobook\n- `8` — Other",
        "format": "int32",
        "x-enum-varnames": [
          "Series",
          "Volume",
          "VolumeBack",
          "Chapter",
          "Issue",
          "Banner",
          "Season",
          "Audiobook",
          "Other"
        ],
        "x-enum-descriptions": [
          "Series",
          "Volume",
          "VolumeBack",
          "Chapter",
          "Issue",
          "Banner",
          "Season",
          "Audiobook",
          "Other"
        ]
      },
      "ExternalCoverResponseDto": {
        "required": [
          "url"
        ],
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "$ref": "#/components/schemas/ExternalCoverImageType"
          },
          "number": {
            "type": "number",
            "format": "float",
            "nullable": true
          },
          "language": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ExternalEditionDto": {
        "required": [
          "format",
          "id",
          "title"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "format": {
            "type": "string",
            "nullable": true
          },
          "language": {
            "type": "string",
            "nullable": true
          },
          "publisher": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "$ref": "#/components/schemas/EditionEntryType"
          },
          "mainCount": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ExternalMetadataIdsDto": {
        "type": "object",
        "properties": {
          "malId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "aniListId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "mangabakaId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "mangaBakaEditionId": {
            "type": "string",
            "nullable": true
          },
          "hardcoverId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "isStandAlone": {
            "type": "boolean"
          },
          "cbrId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "localizedSeriesName": {
            "type": "string",
            "nullable": true
          },
          "plusMediaFormat": {
            "$ref": "#/components/schemas/PlusMediaFormat"
          }
        },
        "additionalProperties": false
      },
      "ExternalSeriesDetailDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "titles": {
            "$ref": "#/components/schemas/ALMediaTitle"
          },
          "localizedTitles": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/LocalizedTitleDto"
              }
            },
            "nullable": true
          },
          "aniListId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "malId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "cbrId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "hardcoverId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "isStandAlone": {
            "type": "boolean"
          },
          "mangabakaId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "synonyms": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "plusMediaFormat": {
            "$ref": "#/components/schemas/PlusMediaFormat"
          },
          "siteUrl": {
            "type": "string",
            "nullable": true
          },
          "coverUrl": {
            "type": "string",
            "nullable": true
          },
          "genres": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "staff": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesStaffDto"
            },
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MetadataTagDto"
            },
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "ageRating": {
            "$ref": "#/components/schemas/AgeRating"
          },
          "ageRatingRaw": {
            "type": "string",
            "nullable": true
          },
          "provider": {
            "$ref": "#/components/schemas/ScrobbleProvider"
          },
          "startDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "endDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "averageScore": {
            "type": "integer",
            "format": "int32"
          },
          "chapters": {
            "type": "integer",
            "format": "int32"
          },
          "volumes": {
            "type": "integer",
            "format": "int32"
          },
          "relations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesRelationship"
            },
            "nullable": true
          },
          "characters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesCharacter"
            },
            "nullable": true
          },
          "ratings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RatingDto"
            },
            "nullable": true
          },
          "publisher": {
            "type": "string",
            "nullable": true
          },
          "chapterDtos": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExternalChapterDto"
            },
            "nullable": true
          },
          "editions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExternalEditionDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ExternalSeriesDto": {
        "required": [
          "coverUrl",
          "name",
          "url"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "coverUrl": {
            "type": "string",
            "nullable": true
          },
          "url": {
            "type": "string",
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "aniListId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "mangaBakaId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "malId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "provider": {
            "$ref": "#/components/schemas/ScrobbleProvider"
          },
          "metadataProvider": {
            "$ref": "#/components/schemas/MetadataProvider"
          },
          "recommendationSource": {
            "$ref": "#/components/schemas/RecommendationSource"
          },
          "ageRating": {
            "$ref": "#/components/schemas/AgeRating"
          }
        },
        "additionalProperties": false
      },
      "ExternalSeriesMatchDto": {
        "type": "object",
        "properties": {
          "series": {
            "$ref": "#/components/schemas/ExternalSeriesDetailDto"
          },
          "matchRating": {
            "type": "number",
            "format": "float"
          }
        },
        "additionalProperties": false
      },
      "ExternalSourceDto": {
        "required": [
          "apiKey",
          "host",
          "id",
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "host": {
            "type": "string",
            "nullable": true
          },
          "apiKey": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FieldMappingsDto": {
        "type": "object",
        "properties": {
          "blacklist": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "whitelist": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "ageRatingMappings": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/AgeRating"
            },
            "nullable": true
          },
          "fieldMappings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MetadataFieldMappingDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FieldMappingsImportResultDto": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "resultingMetadataSettings": {
            "$ref": "#/components/schemas/MetadataSettingsDto"
          },
          "ageRatingConflicts": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FileDimensionDto": {
        "type": "object",
        "properties": {
          "width": {
            "type": "integer",
            "format": "int32"
          },
          "height": {
            "type": "integer",
            "format": "int32"
          },
          "pageNumber": {
            "type": "integer",
            "format": "int32"
          },
          "fileName": {
            "type": "string",
            "nullable": true
          },
          "isWide": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "FileExtensionBreakdownDto": {
        "type": "object",
        "properties": {
          "totalFileSize": {
            "type": "integer",
            "format": "int64"
          },
          "fileBreakdown": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FileExtensionDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FileExtensionDto": {
        "type": "object",
        "properties": {
          "extension": {
            "type": "string",
            "nullable": true
          },
          "format": {
            "$ref": "#/components/schemas/MangaFormat"
          },
          "totalSize": {
            "type": "integer",
            "format": "int64"
          },
          "totalFiles": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FileTypeGroup": {
        "enum": [
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Archive\n- `2` — EPub (Epub)\n- `3` — Pdf\n- `4` — Images",
        "format": "int32",
        "x-enum-varnames": [
          "Archive",
          "Epub",
          "Pdf",
          "Images"
        ],
        "x-enum-descriptions": [
          "Archive",
          "EPub",
          "Pdf",
          "Images"
        ]
      },
      "FilterCombination": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Or\n- `1` — And",
        "format": "int32",
        "x-enum-varnames": [
          "Or",
          "And"
        ],
        "x-enum-descriptions": [
          "Or",
          "And"
        ]
      },
      "FilterComparison": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8,
          9,
          10,
          11,
          12,
          13,
          14,
          15,
          16,
          17
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Equal\n- `1` — GreaterThan\n- `2` — GreaterThanEqual\n- `3` — LessThan\n- `4` — LessThanEqual\n- `5` — Contains\n- `6` — MustContains\n- `7` — Matches\n- `8` — NotContains\n- `9` — NotEqual\n- `10` — BeginsWith\n- `11` — EndsWith\n- `12` — IsBefore\n- `13` — IsAfter\n- `14` — IsInLast\n- `15` — IsNotInLast\n- `16` — IsEmpty\n- `17` — IsNotEmpty",
        "format": "int32",
        "x-enum-varnames": [
          "Equal",
          "GreaterThan",
          "GreaterThanEqual",
          "LessThan",
          "LessThanEqual",
          "Contains",
          "MustContains",
          "Matches",
          "NotContains",
          "NotEqual",
          "BeginsWith",
          "EndsWith",
          "IsBefore",
          "IsAfter",
          "IsInLast",
          "IsNotInLast",
          "IsEmpty",
          "IsNotEmpty"
        ],
        "x-enum-descriptions": [
          "Equal",
          "GreaterThan",
          "GreaterThanEqual",
          "LessThan",
          "LessThanEqual",
          "Contains",
          "MustContains",
          "Matches",
          "NotContains",
          "NotEqual",
          "BeginsWith",
          "EndsWith",
          "IsBefore",
          "IsAfter",
          "IsInLast",
          "IsNotInLast",
          "IsEmpty",
          "IsNotEmpty"
        ]
      },
      "FilterEntityType": {
        "enum": [
          0,
          1,
          2,
          3
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Series\n- `1` — Reading List (ReadingList)\n- `2` — Person\n- `3` — Annotation",
        "format": "int32",
        "x-enum-varnames": [
          "Series",
          "ReadingList",
          "Person",
          "Annotation"
        ],
        "x-enum-descriptions": [
          "Series",
          "Reading List",
          "Person",
          "Annotation"
        ]
      },
      "FontDeleteResultDto": {
        "type": "object",
        "properties": {
          "deleted": {
            "type": "boolean"
          },
          "inUse": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "FontProvider": {
        "enum": [
          1,
          2
        ],
        "type": "integer",
        "description": "Members:\n- `1` — System\n- `2` — User",
        "format": "int32",
        "x-enum-varnames": [
          "System",
          "User"
        ],
        "x-enum-descriptions": [
          "System",
          "User"
        ]
      },
      "GenreTagDto": {
        "required": [
          "title"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GenreTagDtoStatCount": {
        "type": "object",
        "properties": {
          "value": {
            "$ref": "#/components/schemas/GenreTagDto"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "GithubRateLimitDto": {
        "type": "object",
        "properties": {
          "remaining": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "limit": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "resetsAtUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "isLow": {
            "type": "boolean",
            "readOnly": true
          },
          "isExhausted": {
            "type": "boolean",
            "readOnly": true
          }
        },
        "additionalProperties": false
      },
      "GroupedSeriesDto": {
        "type": "object",
        "properties": {
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryType": {
            "$ref": "#/components/schemas/LibraryType"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "format": {
            "$ref": "#/components/schemas/MangaFormat"
          },
          "count": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "HighlightSlot": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "slotNumber": {
            "type": "integer",
            "format": "int32"
          },
          "color": {
            "$ref": "#/components/schemas/RgbaColor"
          }
        },
        "additionalProperties": false
      },
      "HourEstimateRangeDto": {
        "type": "object",
        "properties": {
          "minHours": {
            "type": "integer",
            "format": "int32"
          },
          "maxHours": {
            "type": "integer",
            "format": "int32"
          },
          "avgHours": {
            "type": "number",
            "format": "float"
          },
          "wordCount": {
            "type": "integer",
            "format": "int64"
          },
          "pageCount": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "IFilterDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "combination": {
            "$ref": "#/components/schemas/FilterCombination"
          },
          "limitTo": {
            "type": "integer",
            "format": "int32"
          },
          "entityType": {
            "$ref": "#/components/schemas/FilterEntityType"
          }
        },
        "additionalProperties": false
      },
      "IdentityProvider": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Kavita\n- `1` — OpenID Connect (OpenIdConnect)",
        "format": "int32",
        "x-enum-varnames": [
          "Kavita",
          "OpenIdConnect"
        ],
        "x-enum-descriptions": [
          "Kavita",
          "OpenID Connect"
        ]
      },
      "ImportFieldMappingsDto": {
        "type": "object",
        "properties": {
          "settings": {
            "$ref": "#/components/schemas/ImportSettingsDto"
          },
          "data": {
            "$ref": "#/components/schemas/FieldMappingsDto"
          }
        },
        "additionalProperties": false
      },
      "ImportMode": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Replace\n- `1` — Merge",
        "format": "int32",
        "x-enum-varnames": [
          "Replace",
          "Merge"
        ],
        "x-enum-descriptions": [
          "Replace",
          "Merge"
        ]
      },
      "ImportSettingsDto": {
        "type": "object",
        "properties": {
          "importMode": {
            "$ref": "#/components/schemas/ImportMode"
          },
          "resolution": {
            "$ref": "#/components/schemas/ConflictResolution"
          },
          "whitelist": {
            "type": "boolean"
          },
          "blacklist": {
            "type": "boolean"
          },
          "ageRatings": {
            "type": "boolean"
          },
          "fieldMappings": {
            "type": "boolean"
          },
          "ageRatingConflictResolutions": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/ConflictResolution"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Int32StatCount": {
        "type": "object",
        "properties": {
          "value": {
            "type": "integer",
            "format": "int32"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "InviteUserDto": {
        "required": [
          "email"
        ],
        "type": "object",
        "properties": {
          "email": {
            "minLength": 1,
            "type": "string"
          },
          "roles": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "libraries": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "ageRestriction": {
            "$ref": "#/components/schemas/AgeRestrictionDto"
          }
        },
        "additionalProperties": false
      },
      "InviteUserResponse": {
        "type": "object",
        "properties": {
          "emailLink": {
            "type": "string",
            "nullable": true
          },
          "emailSent": {
            "type": "boolean"
          },
          "invalidEmail": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "JobDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "createdAtUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lastExecutionUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "cron": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "JumpKeyDto": {
        "type": "object",
        "properties": {
          "size": {
            "type": "integer",
            "format": "int32"
          },
          "key": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KavitaLocale": {
        "type": "object",
        "properties": {
          "fileName": {
            "type": "string",
            "nullable": true
          },
          "renderName": {
            "type": "string",
            "nullable": true
          },
          "translationCompletion": {
            "type": "number",
            "format": "float"
          },
          "isRtL": {
            "type": "boolean"
          },
          "hash": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KavitaPlusApiName": {
        "enum": [
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8
        ],
        "type": "integer",
        "description": "Members:\n- `1` — CoverRequests\n- `2` — MetadataSync\n- `3` — SeriesMatched\n- `4` — Scrobbles\n- `5` — MalStackImport\n- `6` — WantToRead\n- `7` — Recommendations\n- `8` — Reviews",
        "format": "int32",
        "x-enum-varnames": [
          "CoverRequests",
          "MetadataSync",
          "SeriesMatched",
          "Scrobbles",
          "MalStackImport",
          "WantToRead",
          "Recommendations",
          "Reviews"
        ],
        "x-enum-descriptions": [
          "CoverRequests",
          "MetadataSync",
          "SeriesMatched",
          "Scrobbles",
          "MalStackImport",
          "WantToRead",
          "Recommendations",
          "Reviews"
        ]
      },
      "KavitaPlusAuditCategory": {
        "enum": [
          0,
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Match\n- `1` — Metadata\n- `2` — Scrobble\n- `3` — Sync\n- `4` — System",
        "format": "int32",
        "x-enum-varnames": [
          "Match",
          "Metadata",
          "Scrobble",
          "Sync",
          "System"
        ],
        "x-enum-descriptions": [
          "Match",
          "Metadata",
          "Scrobble",
          "Sync",
          "System"
        ]
      },
      "KavitaPlusAuditEntryDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int64"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "category": {
            "$ref": "#/components/schemas/KavitaPlusAuditCategory"
          },
          "eventType": {
            "$ref": "#/components/schemas/KavitaPlusEventType"
          },
          "status": {
            "$ref": "#/components/schemas/AuditStatus"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "libraryId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "subjectType": {
            "$ref": "#/components/schemas/AuditSubjectType"
          },
          "subjectId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "userId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "diff": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MetadataFieldChangeDto"
            },
            "nullable": true
          },
          "errorMessage": {
            "type": "string",
            "nullable": true
          },
          "scrobbleDetails": {
            "$ref": "#/components/schemas/KavitaPlusScrobbleDetailsDto"
          },
          "matchDetails": {
            "$ref": "#/components/schemas/KavitaPlusAuditMatchDetailsDto"
          },
          "syncDetails": {
            "$ref": "#/components/schemas/KavitaPlusAuditSyncDetailsDto"
          },
          "metadataExtras": {
            "$ref": "#/components/schemas/KavitaPlusAuditMetadataExtrasDto"
          },
          "systemDetails": {
            "$ref": "#/components/schemas/KavitaPlusAuditSystemDetailsDto"
          },
          "canRetry": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "KavitaPlusAuditFilterDto": {
        "type": "object",
        "properties": {
          "category": {
            "$ref": "#/components/schemas/KavitaPlusAuditCategory"
          },
          "status": {
            "$ref": "#/components/schemas/AuditStatus"
          },
          "subjectType": {
            "$ref": "#/components/schemas/AuditSubjectType"
          },
          "provider": {
            "$ref": "#/components/schemas/ScrobbleProvider"
          },
          "userId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "fromUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "toUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "search": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KavitaPlusAuditMatchDetailsDto": {
        "type": "object",
        "properties": {
          "matchedName": {
            "type": "string",
            "nullable": true
          },
          "before": {
            "$ref": "#/components/schemas/AuditLogMatchExternalIdsParamsDto"
          },
          "after": {
            "$ref": "#/components/schemas/AuditLogMatchExternalIdsParamsDto"
          },
          "reason": {
            "type": "string",
            "nullable": true
          },
          "dontMatch": {
            "type": "boolean",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KavitaPlusAuditMetadataExtrasDto": {
        "type": "object",
        "properties": {
          "coverUrl": {
            "type": "string",
            "nullable": true
          },
          "issueNumber": {
            "type": "string",
            "nullable": true
          },
          "volumeNumber": {
            "type": "string",
            "nullable": true
          },
          "personName": {
            "type": "string",
            "nullable": true
          },
          "aliasAdded": {
            "type": "string",
            "nullable": true
          },
          "fetchTrigger": {
            "$ref": "#/components/schemas/MetadataFetchTrigger"
          }
        },
        "additionalProperties": false
      },
      "KavitaPlusAuditSeriesInfoDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "isMatched": {
            "type": "boolean"
          },
          "aniListId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "malId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "hardcoverId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "metronId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "comicVineId": {
            "type": "string",
            "nullable": true
          },
          "mangaBakaId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "cbrId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "isStandAlone": {
            "type": "boolean"
          },
          "metadataProvider": {
            "$ref": "#/components/schemas/MetadataProvider"
          },
          "nextRefreshUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lastRefreshedUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "recentEvents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KavitaPlusAuditEntryDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KavitaPlusAuditStatsDto": {
        "type": "object",
        "properties": {
          "events24H": {
            "type": "integer",
            "format": "int32"
          },
          "failures24H": {
            "type": "integer",
            "format": "int32"
          },
          "unresolvedMatchFailures": {
            "type": "integer",
            "format": "int32"
          },
          "matchedSeriesCount": {
            "type": "integer",
            "format": "int32"
          },
          "totalEligibleSeriesCount": {
            "type": "integer",
            "format": "int32"
          },
          "staleMatchesCount": {
            "type": "integer",
            "format": "int32"
          },
          "blacklistedSeriesCount": {
            "type": "integer",
            "format": "int32"
          },
          "scrobbleQueueCount": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "KavitaPlusAuditSyncDetailsDto": {
        "type": "object",
        "properties": {
          "collectionName": {
            "type": "string",
            "nullable": true
          },
          "stackId": {
            "type": "string",
            "nullable": true
          },
          "itemCount": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "missingCount": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "collectionUrl": {
            "type": "string",
            "nullable": true
          },
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "userName": {
            "type": "string",
            "nullable": true
          },
          "hasMal": {
            "type": "boolean",
            "nullable": true
          },
          "hasAniList": {
            "type": "boolean",
            "nullable": true
          },
          "seriesMatched": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KavitaPlusAuditSystemDetailsDto": {
        "type": "object",
        "properties": {
          "provider": {
            "$ref": "#/components/schemas/ScrobbleProvider"
          },
          "validUntilUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "userInfo": {
            "$ref": "#/components/schemas/KavitaPlusUserInfo"
          }
        },
        "additionalProperties": false
      },
      "KavitaPlusBillingInterval": {
        "enum": [
          0,
          1,
          2,
          3
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Day\n- `1` — Week\n- `2` — Month\n- `3` — Year",
        "format": "int32",
        "x-enum-varnames": [
          "Day",
          "Week",
          "Month",
          "Year"
        ],
        "x-enum-descriptions": [
          "Day",
          "Week",
          "Month",
          "Year"
        ]
      },
      "KavitaPlusEventType": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          10,
          11,
          13,
          20,
          21,
          22,
          30,
          31,
          40,
          41,
          50,
          51,
          52,
          53,
          54,
          55,
          56,
          57,
          60,
          61,
          62,
          80,
          81
        ],
        "type": "integer",
        "description": "Members:\n- `0` — SeriesMatched\n- `1` — SeriesMatchFailed\n- `2` — SeriesBlacklisted\n- `3` — SeriesMatchFixed\n- `4` — SeriesDontMatchSet\n- `10` — MetadataFetched\n- `11` — MetadataUpdated\n- `13` — CoverUpdated\n- `20` — ChapterMetadataUpdated\n- `21` — ChapterCoverUpdated\n- `22` — VolumeCoverUpdated\n- `30` — PersonCoverUpdated\n- `31` — PersonAliasAdded\n- `40` — CollectionSynced\n- `41` — CollectionItemAdded\n- `50` — ScrobbleEventCreated\n- `51` — ScrobbleEventUpdated\n- `52` — ScrobbleEventSent\n- `53` — ScrobbleEventFailed\n- `54` — ScrobbleRateLimitHit\n- `55` — ScrobbleEventSkipped\n- `56` — ScrobbleHoldRemoved\n- `57` — ScrobbleHoldAdded\n- `60` — SyncStarted\n- `61` — SyncCompleted\n- `62` — SyncFailed\n- `80` — SystemTokenRefresh\n- `81` — SystemProviderInfoSync",
        "format": "int32",
        "x-enum-varnames": [
          "SeriesMatched",
          "SeriesMatchFailed",
          "SeriesBlacklisted",
          "SeriesMatchFixed",
          "SeriesDontMatchSet",
          "MetadataFetched",
          "MetadataUpdated",
          "CoverUpdated",
          "ChapterMetadataUpdated",
          "ChapterCoverUpdated",
          "VolumeCoverUpdated",
          "PersonCoverUpdated",
          "PersonAliasAdded",
          "CollectionSynced",
          "CollectionItemAdded",
          "ScrobbleEventCreated",
          "ScrobbleEventUpdated",
          "ScrobbleEventSent",
          "ScrobbleEventFailed",
          "ScrobbleRateLimitHit",
          "ScrobbleEventSkipped",
          "ScrobbleHoldRemoved",
          "ScrobbleHoldAdded",
          "SyncStarted",
          "SyncCompleted",
          "SyncFailed",
          "SystemTokenRefresh",
          "SystemProviderInfoSync"
        ],
        "x-enum-descriptions": [
          "SeriesMatched",
          "SeriesMatchFailed",
          "SeriesBlacklisted",
          "SeriesMatchFixed",
          "SeriesDontMatchSet",
          "MetadataFetched",
          "MetadataUpdated",
          "CoverUpdated",
          "ChapterMetadataUpdated",
          "ChapterCoverUpdated",
          "VolumeCoverUpdated",
          "PersonCoverUpdated",
          "PersonAliasAdded",
          "CollectionSynced",
          "CollectionItemAdded",
          "ScrobbleEventCreated",
          "ScrobbleEventUpdated",
          "ScrobbleEventSent",
          "ScrobbleEventFailed",
          "ScrobbleRateLimitHit",
          "ScrobbleEventSkipped",
          "ScrobbleHoldRemoved",
          "ScrobbleHoldAdded",
          "SyncStarted",
          "SyncCompleted",
          "SyncFailed",
          "SystemTokenRefresh",
          "SystemProviderInfoSync"
        ]
      },
      "KavitaPlusLicenseUsageDto": {
        "type": "object",
        "properties": {
          "generatedAtUtc": {
            "type": "string",
            "format": "date-time"
          },
          "stats": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiUsageDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KavitaPlusProductInfoDto": {
        "type": "object",
        "properties": {
          "productName": {
            "type": "string",
            "nullable": true
          },
          "priceAmount": {
            "type": "integer",
            "format": "int64"
          },
          "priceCurrency": {
            "type": "string",
            "nullable": true
          },
          "billingInterval": {
            "$ref": "#/components/schemas/KavitaPlusBillingInterval"
          }
        },
        "additionalProperties": false
      },
      "KavitaPlusProviderHealthIncidentType": {
        "enum": [
          1,
          2
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Degraded\n- `2` — Down",
        "format": "int32",
        "x-enum-varnames": [
          "Degraded",
          "Down"
        ],
        "x-enum-descriptions": [
          "Degraded",
          "Down"
        ]
      },
      "KavitaPlusProviderHealthSnapshotDto": {
        "type": "object",
        "properties": {
          "provider": {
            "$ref": "#/components/schemas/ScrobbleProvider"
          },
          "avgLatencyMs": {
            "type": "number",
            "format": "double"
          },
          "status": {
            "$ref": "#/components/schemas/KavitaPlusProviderHealthStatus"
          },
          "lastIncident": {
            "$ref": "#/components/schemas/KavitaPlusProviderIncidentDto"
          }
        },
        "additionalProperties": false
      },
      "KavitaPlusProviderHealthStatus": {
        "enum": [
          0,
          1,
          2,
          3
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Unknown\n- `1` — Operational\n- `2` — Degraded\n- `3` — Down",
        "format": "int32",
        "x-enum-varnames": [
          "Unknown",
          "Operational",
          "Degraded",
          "Down"
        ],
        "x-enum-descriptions": [
          "Unknown",
          "Operational",
          "Degraded",
          "Down"
        ]
      },
      "KavitaPlusProviderIncidentDto": {
        "type": "object",
        "properties": {
          "startedAtUtc": {
            "type": "string",
            "format": "date-time"
          },
          "endedAtUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "type": {
            "$ref": "#/components/schemas/KavitaPlusProviderHealthIncidentType"
          }
        },
        "additionalProperties": false
      },
      "KavitaPlusRegisterResultDto": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "isSubscriptionActive": {
            "type": "boolean"
          },
          "errorCode": {
            "$ref": "#/components/schemas/KavitaPlusRegistrationErrorCode"
          }
        },
        "additionalProperties": false
      },
      "KavitaPlusRegistrationErrorCode": {
        "enum": [
          0,
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "description": "Members:\n- `0` — None\n- `1` — Registration Failed (RegistrationFailed)\n- `2` — Already Registered (AlreadyRegistered)\n- `3` — Subscription Inactive (SubscriptionInactive)\n- `4` — Internal Error (InternalError)",
        "format": "int32",
        "x-enum-varnames": [
          "None",
          "RegistrationFailed",
          "AlreadyRegistered",
          "SubscriptionInactive",
          "InternalError"
        ],
        "x-enum-descriptions": [
          "None",
          "Registration Failed",
          "Already Registered",
          "Subscription Inactive",
          "Internal Error"
        ]
      },
      "KavitaPlusScrobbleDetailsDto": {
        "type": "object",
        "properties": {
          "scrobbleEventType": {
            "$ref": "#/components/schemas/ScrobbleEventType"
          },
          "chapterNumber": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "volumeNumber": {
            "type": "number",
            "format": "float",
            "nullable": true
          },
          "percentRead": {
            "type": "number",
            "format": "float",
            "nullable": true
          },
          "rating": {
            "type": "number",
            "format": "float",
            "nullable": true
          },
          "reviewBody": {
            "type": "string",
            "nullable": true
          },
          "readStatus": {
            "$ref": "#/components/schemas/ScrobbleReadStatus"
          },
          "provider": {
            "$ref": "#/components/schemas/ScrobbleProvider"
          },
          "libraryType": {
            "$ref": "#/components/schemas/LibraryType"
          }
        },
        "additionalProperties": false
      },
      "KavitaPlusSubscriptionState": {
        "enum": [
          0,
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Active\n- `1` — Cancelled\n- `2` — Paused\n- `3` — Cancelling\n- `4` — Expired",
        "format": "int32",
        "x-enum-varnames": [
          "Active",
          "Cancelled",
          "Paused",
          "Cancelling",
          "Expired"
        ],
        "x-enum-descriptions": [
          "Active",
          "Cancelled",
          "Paused",
          "Cancelling",
          "Expired"
        ]
      },
      "KavitaPlusUserInfo": {
        "required": [
          "username"
        ],
        "type": "object",
        "properties": {
          "username": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KeyBind": {
        "required": [
          "key"
        ],
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "nullable": true
          },
          "control": {
            "type": "boolean"
          },
          "shift": {
            "type": "boolean"
          },
          "meta": {
            "type": "boolean"
          },
          "alt": {
            "type": "boolean"
          },
          "controllerSequence": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KoreaderBookDto": {
        "type": "object",
        "properties": {
          "document": {
            "type": "string",
            "nullable": true
          },
          "device_id": {
            "type": "string",
            "nullable": true
          },
          "device": {
            "type": "string",
            "nullable": true
          },
          "percentage": {
            "type": "number",
            "format": "float"
          },
          "progress": {
            "type": "string",
            "nullable": true
          },
          "timestamp": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "KoreaderProgressUpdateDto": {
        "type": "object",
        "properties": {
          "document": {
            "type": "string",
            "nullable": true
          },
          "timestamp": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "LanguageDto": {
        "required": [
          "isoCode",
          "title"
        ],
        "type": "object",
        "properties": {
          "isoCode": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "LayoutMode": {
        "enum": [
          1,
          2,
          3
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Single\n- `2` — Double\n- `3` — Double (manga) (DoubleReversed)",
        "format": "int32",
        "x-enum-varnames": [
          "Single",
          "Double",
          "DoubleReversed"
        ],
        "x-enum-descriptions": [
          "Single",
          "Double",
          "Double (manga)"
        ]
      },
      "LibraryDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "$ref": "#/components/schemas/LibraryType"
          },
          "lastScanned": {
            "type": "string",
            "format": "date-time"
          },
          "coverImage": {
            "type": "string",
            "nullable": true
          },
          "folderWatching": {
            "type": "boolean"
          },
          "includeInDashboard": {
            "type": "boolean"
          },
          "includeInRecommended": {
            "type": "boolean"
          },
          "manageCollections": {
            "type": "boolean"
          },
          "manageReadingLists": {
            "type": "boolean"
          },
          "includeInSearch": {
            "type": "boolean"
          },
          "allowScrobbling": {
            "type": "boolean"
          },
          "folders": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "collapseSeriesRelationships": {
            "type": "boolean"
          },
          "libraryFileTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FileTypeGroup"
            },
            "nullable": true
          },
          "excludePatterns": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "allowMetadataMatching": {
            "type": "boolean"
          },
          "enableMetadata": {
            "type": "boolean"
          },
          "removePrefixForSortName": {
            "type": "boolean"
          },
          "inheritWebLinksFromFirstChapter": {
            "type": "boolean"
          },
          "defaultLanguage": {
            "type": "string",
            "nullable": true
          },
          "metadataProvider": {
            "$ref": "#/components/schemas/MetadataProvider"
          }
        },
        "additionalProperties": false
      },
      "LibraryDtoStatCount": {
        "type": "object",
        "properties": {
          "value": {
            "$ref": "#/components/schemas/LibraryDto"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "LibraryType": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Manga\n- `1` — Comic (Flexible) (Comic)\n- `2` — Book\n- `3` — Image\n- `4` — Light Novel (LightNovel)\n- `5` — Comic (ComicVine)",
        "format": "int32",
        "x-enum-varnames": [
          "Manga",
          "Comic",
          "Book",
          "Image",
          "LightNovel",
          "ComicVine"
        ],
        "x-enum-descriptions": [
          "Manga",
          "Comic (Flexible)",
          "Book",
          "Image",
          "Light Novel",
          "Comic"
        ]
      },
      "LicenseInfoDto": {
        "type": "object",
        "properties": {
          "state": {
            "$ref": "#/components/schemas/KavitaPlusSubscriptionState"
          },
          "isActive": {
            "type": "boolean"
          },
          "isCancelled": {
            "type": "boolean"
          },
          "expirationDate": {
            "type": "string",
            "format": "date-time"
          },
          "nextChargeDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "subscribedSince": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "productName": {
            "type": "string",
            "nullable": true
          },
          "priceAmount": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "priceCurrency": {
            "type": "string",
            "nullable": true
          },
          "billingInterval": {
            "$ref": "#/components/schemas/KavitaPlusBillingInterval"
          },
          "hasActiveDiscount": {
            "type": "boolean"
          },
          "isValidVersion": {
            "type": "boolean"
          },
          "registeredEmail": {
            "type": "string",
            "nullable": true
          },
          "totalMonthsSubbed": {
            "type": "integer",
            "format": "int32"
          },
          "hasLicense": {
            "type": "boolean"
          },
          "installId": {
            "type": "string",
            "nullable": true
          },
          "pastDue": {
            "type": "boolean"
          },
          "discordId": {
            "type": "string",
            "nullable": true
          },
          "discordUsername": {
            "type": "string",
            "nullable": true
          },
          "hasDiscordSet": {
            "type": "boolean",
            "readOnly": true
          }
        },
        "additionalProperties": false
      },
      "LocalizedTitleDto": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "nullable": true
          },
          "isPrimary": {
            "type": "boolean"
          },
          "isOfficial": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "LoginDto": {
        "type": "object",
        "properties": {
          "username": {
            "type": "string",
            "nullable": true
          },
          "password": {
            "type": "string",
            "nullable": true
          },
          "apiKey": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MalStackDto": {
        "required": [
          "author",
          "restackCount",
          "seriesCount",
          "stackId",
          "title",
          "url"
        ],
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "nullable": true
          },
          "stackId": {
            "type": "integer",
            "format": "int64"
          },
          "url": {
            "type": "string",
            "nullable": true
          },
          "author": {
            "type": "string",
            "nullable": true
          },
          "seriesCount": {
            "type": "integer",
            "format": "int32"
          },
          "restackCount": {
            "type": "integer",
            "format": "int32"
          },
          "existingId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ManageMatchFilterDto": {
        "type": "object",
        "properties": {
          "matchStateOption": {
            "$ref": "#/components/schemas/MatchStateOption"
          },
          "libraryType": {
            "type": "integer",
            "format": "int32"
          },
          "searchTerm": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ManageMatchSeriesDto": {
        "type": "object",
        "properties": {
          "series": {
            "$ref": "#/components/schemas/SeriesDto"
          },
          "isMatched": {
            "type": "boolean"
          },
          "validUntilUtc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "MangaFileDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "filePath": {
            "type": "string",
            "nullable": true
          },
          "pages": {
            "type": "integer",
            "format": "int32"
          },
          "bytes": {
            "type": "integer",
            "format": "int64"
          },
          "format": {
            "$ref": "#/components/schemas/MangaFormat"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "extension": {
            "type": "string",
            "nullable": true
          },
          "koreaderHash": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MangaFormat": {
        "enum": [
          0,
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Image\n- `1` — Archive\n- `2` — Unknown\n- `3` — EPUB (Epub)\n- `4` — PDF (Pdf)",
        "format": "int32",
        "x-enum-varnames": [
          "Image",
          "Archive",
          "Unknown",
          "Epub",
          "Pdf"
        ],
        "x-enum-descriptions": [
          "Image",
          "Archive",
          "Unknown",
          "EPUB",
          "PDF"
        ]
      },
      "MangaFormatStatCount": {
        "type": "object",
        "properties": {
          "value": {
            "$ref": "#/components/schemas/MangaFormat"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "MarkChapterReadDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "generateReadingSession": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "MarkMultipleSeriesAsReadDto": {
        "type": "object",
        "properties": {
          "seriesIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "generateReadingSession": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "MarkReadDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "generateReadingSession": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "MarkVolumeReadDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "generateReadingSession": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "MarkVolumesReadDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "chapterIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "generateReadingSession": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "MatchSeriesDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "query": {
            "type": "string",
            "nullable": true
          },
          "isStandAlone": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "MatchSeriesInfoDto": {
        "type": "object",
        "properties": {
          "hasMatch": {
            "type": "boolean"
          },
          "isLegacy": {
            "type": "boolean"
          },
          "plusMediaFormat": {
            "$ref": "#/components/schemas/PlusMediaFormat"
          },
          "libraryType": {
            "$ref": "#/components/schemas/LibraryType"
          },
          "matchedProvider": {
            "$ref": "#/components/schemas/MetadataProvider"
          },
          "primaryProvider": {
            "$ref": "#/components/schemas/MetadataProvider"
          },
          "seriesFormat": {
            "$ref": "#/components/schemas/MangaFormat"
          },
          "mangaBakaId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "aniListId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "hardcoverId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "cbrId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "mangaBakaEditionId": {
            "type": "string",
            "nullable": true
          },
          "isStandalone": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "MatchStateOption": {
        "enum": [
          0,
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "description": "Members:\n- `0` — All\n- `1` — Matched\n- `2` — NotMatched\n- `3` — Error\n- `4` — DontMatch",
        "format": "int32",
        "x-enum-varnames": [
          "All",
          "Matched",
          "NotMatched",
          "Error",
          "DontMatch"
        ],
        "x-enum-descriptions": [
          "All",
          "Matched",
          "NotMatched",
          "Error",
          "DontMatch"
        ]
      },
      "MediaErrorDto": {
        "required": [
          "extension",
          "filePath"
        ],
        "type": "object",
        "properties": {
          "extension": {
            "type": "string",
            "nullable": true
          },
          "filePath": {
            "type": "string",
            "nullable": true
          },
          "comment": {
            "type": "string",
            "nullable": true
          },
          "details": {
            "type": "string",
            "nullable": true
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "MemberDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "isPending": {
            "type": "boolean"
          },
          "ageRestriction": {
            "$ref": "#/components/schemas/AgeRestrictionDto"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastActive": {
            "type": "string",
            "format": "date-time"
          },
          "lastActiveUtc": {
            "type": "string",
            "format": "date-time"
          },
          "libraries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LibraryDto"
            },
            "nullable": true
          },
          "roles": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "identityProvider": {
            "$ref": "#/components/schemas/IdentityProvider"
          }
        },
        "additionalProperties": false
      },
      "MemberInfoDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "coverImage": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MetadataFetchTrigger": {
        "enum": [
          0,
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Unknown\n- `1` — Series Added (SeriesAdded)\n- `2` — On Demand (OnDemand)\n- `3` — Manual Match (ManualMatch)\n- `4` — Scheduled Refresh (ScheduledRefresh)",
        "format": "int32",
        "x-enum-varnames": [
          "Unknown",
          "SeriesAdded",
          "OnDemand",
          "ManualMatch",
          "ScheduledRefresh"
        ],
        "x-enum-descriptions": [
          "Unknown",
          "Series Added",
          "On Demand",
          "Manual Match",
          "Scheduled Refresh"
        ]
      },
      "MetadataFieldChangeDto": {
        "type": "object",
        "properties": {
          "field": {
            "$ref": "#/components/schemas/MetadataFieldChangeKind"
          },
          "from": {
            "nullable": true
          },
          "to": {
            "nullable": true
          },
          "note": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MetadataFieldChangeKind": {
        "enum": [
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8,
          9,
          10,
          11,
          12,
          13,
          14,
          15
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Relationships\n- `2` — Characters\n- `3` — Artists\n- `4` — Writers\n- `5` — Tags\n- `6` — Genres\n- `7` — PublicationStatus\n- `8` — AgeRating\n- `9` — ExternalIds\n- `10` — Summary\n- `11` — Title\n- `12` — ReleaseDate\n- `13` — ReleaseYear\n- `14` — LocalizedName\n- `15` — Name",
        "format": "int32",
        "x-enum-varnames": [
          "Relationships",
          "Characters",
          "Artists",
          "Writers",
          "Tags",
          "Genres",
          "PublicationStatus",
          "AgeRating",
          "ExternalIds",
          "Summary",
          "Title",
          "ReleaseDate",
          "ReleaseYear",
          "LocalizedName",
          "Name"
        ],
        "x-enum-descriptions": [
          "Relationships",
          "Characters",
          "Artists",
          "Writers",
          "Tags",
          "Genres",
          "PublicationStatus",
          "AgeRating",
          "ExternalIds",
          "Summary",
          "Title",
          "ReleaseDate",
          "ReleaseYear",
          "LocalizedName",
          "Name"
        ]
      },
      "MetadataFieldMappingDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "sourceType": {
            "$ref": "#/components/schemas/MetadataFieldType"
          },
          "destinationType": {
            "$ref": "#/components/schemas/MetadataFieldType"
          },
          "sourceValue": {
            "type": "string",
            "nullable": true
          },
          "destinationValue": {
            "type": "string",
            "nullable": true
          },
          "excludeFromSource": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "MetadataFieldType": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Genre\n- `1` — Tag",
        "format": "int32",
        "x-enum-varnames": [
          "Genre",
          "Tag"
        ],
        "x-enum-descriptions": [
          "Genre",
          "Tag"
        ]
      },
      "MetadataProvider": {
        "enum": [
          2,
          3,
          4
        ],
        "type": "integer",
        "description": "Members:\n- `2` — Hardcover\n- `3` — Mangabaka\n- `4` — ComicBookRoundup",
        "format": "int32",
        "x-enum-varnames": [
          "Hardcover",
          "Mangabaka",
          "ComicBookRoundup"
        ],
        "x-enum-descriptions": [
          "Hardcover",
          "Mangabaka",
          "ComicBookRoundup"
        ]
      },
      "MetadataSettingField": {
        "enum": [
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8,
          9,
          10,
          20,
          21,
          22,
          23,
          24,
          25,
          40
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Summary\n- `2` — PublicationStatus\n- `3` — StartDate\n- `4` — Genres\n- `5` — Tags\n- `6` — LocalizedName\n- `7` — Covers\n- `8` — AgeRating\n- `9` — People\n- `10` — Name\n- `20` — ChapterTitle\n- `21` — ChapterSummary\n- `22` — ChapterReleaseDate\n- `23` — ChapterPublisher\n- `24` — ChapterCovers\n- `25` — ChapterAgeRating\n- `40` — VolumeCovers",
        "format": "int32",
        "x-enum-varnames": [
          "Summary",
          "PublicationStatus",
          "StartDate",
          "Genres",
          "Tags",
          "LocalizedName",
          "Covers",
          "AgeRating",
          "People",
          "Name",
          "ChapterTitle",
          "ChapterSummary",
          "ChapterReleaseDate",
          "ChapterPublisher",
          "ChapterCovers",
          "ChapterAgeRating",
          "VolumeCovers"
        ],
        "x-enum-descriptions": [
          "Summary",
          "PublicationStatus",
          "StartDate",
          "Genres",
          "Tags",
          "LocalizedName",
          "Covers",
          "AgeRating",
          "People",
          "Name",
          "ChapterTitle",
          "ChapterSummary",
          "ChapterReleaseDate",
          "ChapterPublisher",
          "ChapterCovers",
          "ChapterAgeRating",
          "VolumeCovers"
        ]
      },
      "MetadataSettingsDto": {
        "type": "object",
        "properties": {
          "blacklist": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "whitelist": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "ageRatingMappings": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/AgeRating"
            },
            "nullable": true
          },
          "fieldMappings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MetadataFieldMappingDto"
            },
            "nullable": true
          },
          "enabled": {
            "type": "boolean"
          },
          "enableExtendedMetadataProcessing": {
            "type": "boolean"
          },
          "enableSummary": {
            "type": "boolean"
          },
          "enablePublicationStatus": {
            "type": "boolean"
          },
          "enableAgeRating": {
            "type": "boolean"
          },
          "enableRelationships": {
            "type": "boolean"
          },
          "enablePeople": {
            "type": "boolean"
          },
          "enableStartDate": {
            "type": "boolean"
          },
          "enableLocalizedName": {
            "type": "boolean"
          },
          "enableName": {
            "type": "boolean"
          },
          "enableCoverImage": {
            "type": "boolean"
          },
          "enableChapterSummary": {
            "type": "boolean"
          },
          "enableChapterReleaseDate": {
            "type": "boolean"
          },
          "enableChapterTitle": {
            "type": "boolean"
          },
          "enableChapterPublisher": {
            "type": "boolean"
          },
          "enableChapterCoverImage": {
            "type": "boolean"
          },
          "enableVolumeCoverImage": {
            "type": "boolean"
          },
          "enableGenres": {
            "type": "boolean"
          },
          "enableTags": {
            "type": "boolean"
          },
          "firstLastPeopleNaming": {
            "type": "boolean"
          },
          "externalAgeRatingMappings": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/AgeRating"
            },
            "nullable": true
          },
          "globalLanguageTitleSettings": {
            "$ref": "#/components/schemas/SeriesNameLanguageDto"
          },
          "libraryLanguageTitleOverrides": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/SeriesNameLanguageDto"
            },
            "nullable": true
          },
          "overrides": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MetadataSettingField"
            },
            "nullable": true
          },
          "personRoles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonRole"
            },
            "nullable": true
          },
          "filterAboveWeight": {
            "$ref": "#/components/schemas/TagWeight"
          }
        },
        "additionalProperties": false
      },
      "MetadataTagDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true,
            "readOnly": true
          },
          "rank": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          },
          "isGeneralSpoiler": {
            "type": "boolean",
            "readOnly": true
          },
          "isMediaSpoiler": {
            "type": "boolean",
            "readOnly": true
          },
          "isAdult": {
            "type": "boolean",
            "readOnly": true
          },
          "tagWeight": {
            "$ref": "#/components/schemas/TagWeight"
          }
        },
        "additionalProperties": false
      },
      "MostReadAuthorsDto": {
        "type": "object",
        "properties": {
          "authorId": {
            "type": "integer",
            "format": "int32"
          },
          "authorName": {
            "type": "string",
            "nullable": true
          },
          "totalChaptersRead": {
            "type": "integer",
            "format": "int32"
          },
          "chapters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AuthorChapterDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "NextExpectedChapterDto": {
        "type": "object",
        "properties": {
          "chapterNumber": {
            "type": "number",
            "format": "float"
          },
          "volumeNumber": {
            "type": "number",
            "format": "float"
          },
          "expectedDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "OAuthUpstream": {
        "enum": [
          0,
          1,
          2,
          3
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Discord\n- `1` — MangaBaka\n- `2` — AniList\n- `3` — MyAnimeList",
        "format": "int32",
        "x-enum-varnames": [
          "Discord",
          "MangaBaka",
          "AniList",
          "MyAnimeList"
        ],
        "x-enum-descriptions": [
          "Discord",
          "MangaBaka",
          "AniList",
          "MyAnimeList"
        ]
      },
      "OidcConfigDto": {
        "type": "object",
        "properties": {
          "autoLogin": {
            "type": "boolean"
          },
          "disablePasswordAuthentication": {
            "type": "boolean"
          },
          "providerName": {
            "type": "string",
            "nullable": true
          },
          "authority": {
            "type": "string",
            "nullable": true
          },
          "clientId": {
            "type": "string",
            "nullable": true
          },
          "secret": {
            "type": "string",
            "nullable": true
          },
          "provisionAccounts": {
            "type": "boolean"
          },
          "requireVerifiedEmail": {
            "type": "boolean"
          },
          "syncUserSettings": {
            "type": "boolean"
          },
          "rolesPrefix": {
            "type": "string",
            "nullable": true
          },
          "rolesClaim": {
            "type": "string",
            "nullable": true
          },
          "customScopes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "defaultRoles": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "defaultLibraries": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "defaultAgeRestriction": {
            "$ref": "#/components/schemas/AgeRating"
          },
          "defaultIncludeUnknowns": {
            "type": "boolean"
          },
          "enabled": {
            "type": "boolean",
            "readOnly": true
          }
        },
        "additionalProperties": false
      },
      "OidcPublicConfigDto": {
        "type": "object",
        "properties": {
          "autoLogin": {
            "type": "boolean"
          },
          "disablePasswordAuthentication": {
            "type": "boolean"
          },
          "providerName": {
            "type": "string",
            "nullable": true
          },
          "enabled": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "PageLayoutMode": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Cards\n- `1` — List",
        "format": "int32",
        "x-enum-varnames": [
          "Cards",
          "List"
        ],
        "x-enum-descriptions": [
          "Cards",
          "List"
        ]
      },
      "PageSplitOption": {
        "enum": [
          0,
          1,
          2,
          3
        ],
        "type": "integer",
        "description": "Members:\n- `0` — SplitLeftToRight\n- `1` — SplitRightToLeft\n- `2` — NoSplit\n- `3` — FitSplit",
        "format": "int32",
        "x-enum-varnames": [
          "SplitLeftToRight",
          "SplitRightToLeft",
          "NoSplit",
          "FitSplit"
        ],
        "x-enum-descriptions": [
          "SplitLeftToRight",
          "SplitRightToLeft",
          "NoSplit",
          "FitSplit"
        ]
      },
      "ParseBulkRequestDto": {
        "type": "object",
        "properties": {
          "names": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "libraryType": {
            "$ref": "#/components/schemas/LibraryType"
          }
        },
        "additionalProperties": false
      },
      "ParseBulkResponseDto": {
        "type": "object",
        "properties": {
          "results": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/ParseResultDto"
            },
            "nullable": true
          },
          "errors": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "nullable": true
            },
            "nullable": true
          },
          "errorCounts": {
            "type": "integer",
            "format": "int32",
            "readOnly": true
          }
        },
        "additionalProperties": false
      },
      "ParseResultDto": {
        "type": "object",
        "properties": {
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "seriesYear": {
            "type": "string",
            "nullable": true
          },
          "minChapterNumber": {
            "type": "number",
            "format": "float"
          },
          "maxChapterNumber": {
            "type": "number",
            "format": "float"
          },
          "minVolumeNumber": {
            "type": "number",
            "format": "float"
          },
          "maxVolumeNumber": {
            "type": "number",
            "format": "float"
          }
        },
        "additionalProperties": false
      },
      "PdfRenderResolution": {
        "enum": [
          1,
          2,
          3
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Default\n- `2` — High\n- `3` — Ultra",
        "format": "int32",
        "x-enum-varnames": [
          "Default",
          "High",
          "Ultra"
        ],
        "x-enum-descriptions": [
          "Default",
          "High",
          "Ultra"
        ]
      },
      "PdfScrollMode": {
        "enum": [
          0,
          1,
          3
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Vertical\n- `1` — Horizontal\n- `3` — Page",
        "format": "int32",
        "x-enum-varnames": [
          "Vertical",
          "Horizontal",
          "Page"
        ],
        "x-enum-descriptions": [
          "Vertical",
          "Horizontal",
          "Page"
        ]
      },
      "PdfSpreadMode": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "description": "Members:\n- `0` — None\n- `1` — Odd\n- `2` — Even",
        "format": "int32",
        "x-enum-varnames": [
          "None",
          "Odd",
          "Even"
        ],
        "x-enum-descriptions": [
          "None",
          "Odd",
          "Even"
        ]
      },
      "PdfTheme": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Dark\n- `1` — Light",
        "format": "int32",
        "x-enum-varnames": [
          "Dark",
          "Light"
        ],
        "x-enum-descriptions": [
          "Dark",
          "Light"
        ]
      },
      "PersonAliasCheckDto": {
        "required": [
          "alias",
          "name",
          "personId"
        ],
        "type": "object",
        "properties": {
          "personId": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "minLength": 1,
            "type": "string"
          },
          "alias": {
            "minLength": 1,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "PersonDto": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "coverImageLocked": {
            "type": "boolean"
          },
          "primaryColor": {
            "type": "string",
            "nullable": true
          },
          "secondaryColor": {
            "type": "string",
            "nullable": true
          },
          "coverImage": {
            "type": "string",
            "nullable": true
          },
          "aliases": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "asin": {
            "type": "string",
            "nullable": true
          },
          "aniListId": {
            "type": "integer",
            "format": "int32"
          },
          "malId": {
            "type": "integer",
            "format": "int64"
          },
          "hardcoverId": {
            "type": "string",
            "nullable": true
          },
          "webLinks": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "roles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonRole"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PersonDtoStatCount": {
        "type": "object",
        "properties": {
          "value": {
            "$ref": "#/components/schemas/PersonDto"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "PersonFilterDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "statements": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonFilterStatementDto"
            },
            "nullable": true
          },
          "combination": {
            "$ref": "#/components/schemas/FilterCombination"
          },
          "sortOptions": {
            "$ref": "#/components/schemas/PersonSortOptionDto"
          },
          "entityType": {
            "$ref": "#/components/schemas/FilterEntityType"
          },
          "limitTo": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "PersonFilterField": {
        "enum": [
          1,
          2,
          3,
          4,
          5
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Role\n- `2` — Name\n- `3` — SeriesCount\n- `4` — ChapterCount\n- `5` — Library",
        "format": "int32",
        "x-enum-varnames": [
          "Role",
          "Name",
          "SeriesCount",
          "ChapterCount",
          "Library"
        ],
        "x-enum-descriptions": [
          "Role",
          "Name",
          "SeriesCount",
          "ChapterCount",
          "Library"
        ]
      },
      "PersonFilterStatementDto": {
        "type": "object",
        "properties": {
          "comparison": {
            "$ref": "#/components/schemas/FilterComparison"
          },
          "field": {
            "$ref": "#/components/schemas/PersonFilterField"
          },
          "value": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PersonMergeDto": {
        "required": [
          "destId",
          "srcId"
        ],
        "type": "object",
        "properties": {
          "destId": {
            "type": "integer",
            "format": "int32"
          },
          "srcId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "PersonRole": {
        "enum": [
          3,
          4,
          5,
          6,
          7,
          8,
          9,
          10,
          11,
          12,
          13,
          14,
          15
        ],
        "type": "integer",
        "description": "Members:\n- `3` — Writer\n- `4` — Penciller\n- `5` — Inker\n- `6` — Colorist\n- `7` — Letterer\n- `8` — CoverArtist\n- `9` — Editor\n- `10` — Publisher\n- `11` — Character\n- `12` — Translator\n- `13` — Imprint\n- `14` — Team\n- `15` — Location",
        "format": "int32",
        "x-enum-varnames": [
          "Writer",
          "Penciller",
          "Inker",
          "Colorist",
          "Letterer",
          "CoverArtist",
          "Editor",
          "Publisher",
          "Character",
          "Translator",
          "Imprint",
          "Team",
          "Location"
        ],
        "x-enum-descriptions": [
          "Writer",
          "Penciller",
          "Inker",
          "Colorist",
          "Letterer",
          "CoverArtist",
          "Editor",
          "Publisher",
          "Character",
          "Translator",
          "Imprint",
          "Team",
          "Location"
        ]
      },
      "PersonSortField": {
        "enum": [
          1,
          2,
          3
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Name\n- `2` — SeriesCount\n- `3` — ChapterCount",
        "format": "int32",
        "x-enum-varnames": [
          "Name",
          "SeriesCount",
          "ChapterCount"
        ],
        "x-enum-descriptions": [
          "Name",
          "SeriesCount",
          "ChapterCount"
        ]
      },
      "PersonSortOptionDto": {
        "type": "object",
        "properties": {
          "sortField": {
            "$ref": "#/components/schemas/PersonSortField"
          },
          "isAscending": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "PersonalToCDto": {
        "required": [
          "chapterId",
          "id",
          "pageNumber",
          "title"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "pageNumber": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "bookScrollId": {
            "type": "string",
            "nullable": true
          },
          "selectedText": {
            "type": "string",
            "nullable": true
          },
          "chapterTitle": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PlusMediaFormat": {
        "enum": [
          1,
          2,
          3,
          4,
          5
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Manga\n- `2` — Comic\n- `3` — LightNovel\n- `4` — Book\n- `5` — Unknown",
        "format": "int32",
        "x-enum-varnames": [
          "Manga",
          "Comic",
          "LightNovel",
          "Book",
          "Unknown"
        ],
        "x-enum-descriptions": [
          "Manga",
          "Comic",
          "LightNovel",
          "Book",
          "Unknown"
        ]
      },
      "ProfileStatBarDto": {
        "type": "object",
        "properties": {
          "booksRead": {
            "type": "integer",
            "format": "int32"
          },
          "comicsRead": {
            "type": "integer",
            "format": "int32"
          },
          "pagesRead": {
            "type": "integer",
            "format": "int32"
          },
          "wordsRead": {
            "type": "integer",
            "format": "int32"
          },
          "authorsRead": {
            "type": "integer",
            "format": "int32"
          },
          "reviews": {
            "type": "integer",
            "format": "int32"
          },
          "ratings": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ProgressDto": {
        "required": [
          "chapterId",
          "libraryId",
          "pageNum",
          "seriesId",
          "volumeId"
        ],
        "type": "object",
        "properties": {
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "pageNum": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "bookScrollId": {
            "type": "string",
            "nullable": true
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "PromoteCollectionsDto": {
        "type": "object",
        "properties": {
          "collectionIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "promoted": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "PromoteReadingListsDto": {
        "type": "object",
        "properties": {
          "readingListIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "promoted": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "PublicationStatus": {
        "enum": [
          0,
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Ongoing (OnGoing)\n- `1` — Hiatus\n- `2` — Completed\n- `3` — Cancelled\n- `4` — Ended",
        "format": "int32",
        "x-enum-varnames": [
          "OnGoing",
          "Hiatus",
          "Completed",
          "Cancelled",
          "Ended"
        ],
        "x-enum-descriptions": [
          "Ongoing",
          "Hiatus",
          "Completed",
          "Cancelled",
          "Ended"
        ]
      },
      "PublicationStatusStatCount": {
        "type": "object",
        "properties": {
          "value": {
            "$ref": "#/components/schemas/PublicationStatus"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "QueryContext": {
        "enum": [
          1,
          2,
          4
        ],
        "type": "integer",
        "description": "Members:\n- `1` — None\n- `2` — Search\n- `4` — Dashboard",
        "format": "int32",
        "x-enum-varnames": [
          "None",
          "Search",
          "Dashboard"
        ],
        "x-enum-descriptions": [
          "None",
          "Search",
          "Dashboard"
        ]
      },
      "RatingAuthority": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "description": "Members:\n- `0` — User\n- `1` — Critic",
        "format": "int32",
        "x-enum-varnames": [
          "User",
          "Critic"
        ],
        "x-enum-descriptions": [
          "User",
          "Critic"
        ]
      },
      "RatingDto": {
        "type": "object",
        "properties": {
          "averageScore": {
            "type": "integer",
            "format": "int32"
          },
          "favoriteCount": {
            "type": "integer",
            "format": "int32",
            "deprecated": true
          },
          "provider": {
            "$ref": "#/components/schemas/ScrobbleProvider"
          },
          "authority": {
            "$ref": "#/components/schemas/RatingAuthority"
          },
          "providerUrl": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ReadStatusTransitionRule": {
        "type": "object",
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "days": {
            "type": "integer",
            "format": "int32"
          },
          "transitionStatus": {
            "$ref": "#/components/schemas/ScrobbleReadStatus"
          },
          "excludedPublicationStatus": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicationStatus"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ReadTimeByHourDto": {
        "type": "object",
        "properties": {
          "dataSince": {
            "type": "string",
            "format": "date-time"
          },
          "stats": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Int32StatCount"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ReaderMode": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Left and Right (LeftRight)\n- `1` — Up and Down (UpDown)\n- `2` — Webtoon",
        "format": "int32",
        "x-enum-varnames": [
          "LeftRight",
          "UpDown",
          "Webtoon"
        ],
        "x-enum-descriptions": [
          "Left and Right",
          "Up and Down",
          "Webtoon"
        ]
      },
      "ReadingActivityDataDto": {
        "type": "object",
        "properties": {
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "startPage": {
            "type": "integer",
            "format": "int32"
          },
          "endPage": {
            "type": "integer",
            "format": "int32"
          },
          "startTimeUtc": {
            "type": "string",
            "format": "date-time"
          },
          "endTimeUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "pagesRead": {
            "type": "integer",
            "format": "int32"
          },
          "wordsRead": {
            "type": "integer",
            "format": "int32"
          },
          "totalPages": {
            "type": "integer",
            "format": "int32"
          },
          "totalWords": {
            "type": "integer",
            "format": "int32"
          },
          "libraryName": {
            "type": "string",
            "nullable": true
          },
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "chapterTitle": {
            "type": "string",
            "nullable": true
          },
          "clientInfo": {
            "$ref": "#/components/schemas/ClientInfoDto"
          }
        },
        "additionalProperties": false
      },
      "ReadingActivityGraphEntryDto": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "format": "date-time"
          },
          "totalTimeReadingSeconds": {
            "type": "integer",
            "format": "int32"
          },
          "totalPages": {
            "type": "integer",
            "format": "int32"
          },
          "totalWords": {
            "type": "integer",
            "format": "int32"
          },
          "totalChaptersFullyRead": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ReadingDirection": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "description": "Members:\n- `0` — LeftToRight\n- `1` — RightToLeft",
        "format": "int32",
        "x-enum-varnames": [
          "LeftToRight",
          "RightToLeft"
        ],
        "x-enum-descriptions": [
          "LeftToRight",
          "RightToLeft"
        ]
      },
      "ReadingHistoryChapterItemDto": {
        "type": "object",
        "properties": {
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "label": {
            "type": "string",
            "nullable": true
          },
          "startTimeUtc": {
            "type": "string",
            "format": "date-time"
          },
          "endTimeUtc": {
            "type": "string",
            "format": "date-time"
          },
          "pagesRead": {
            "type": "integer",
            "format": "int32"
          },
          "wordsRead": {
            "type": "integer",
            "format": "int32"
          },
          "durationSeconds": {
            "type": "integer",
            "format": "int32"
          },
          "startPage": {
            "type": "integer",
            "format": "int32"
          },
          "endPage": {
            "type": "integer",
            "format": "int32"
          },
          "totalPages": {
            "type": "integer",
            "format": "int32"
          },
          "completed": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ReadingHistoryItemDto": {
        "type": "object",
        "properties": {
          "sessionDataIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "sessionId": {
            "type": "integer",
            "format": "int32"
          },
          "isGeneratedSession": {
            "type": "boolean"
          },
          "startTimeUtc": {
            "type": "string",
            "format": "date-time"
          },
          "endTimeUtc": {
            "type": "string",
            "format": "date-time"
          },
          "localDate": {
            "type": "string",
            "format": "date-time"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "seriesFormat": {
            "$ref": "#/components/schemas/MangaFormat"
          },
          "chapters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ReadingHistoryChapterItemDto"
            },
            "nullable": true
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryName": {
            "type": "string",
            "nullable": true
          },
          "pagesRead": {
            "type": "integer",
            "format": "int32"
          },
          "wordsRead": {
            "type": "integer",
            "format": "int32"
          },
          "durationSeconds": {
            "type": "integer",
            "format": "int32"
          },
          "totalPages": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ReadingListDto": {
        "required": [
          "ageRating"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "promoted": {
            "type": "boolean"
          },
          "coverImageLocked": {
            "type": "boolean"
          },
          "coverImage": {
            "type": "string",
            "nullable": true
          },
          "primaryColor": {
            "type": "string",
            "nullable": true
          },
          "secondaryColor": {
            "type": "string",
            "nullable": true
          },
          "itemCount": {
            "type": "integer",
            "format": "int32"
          },
          "startingYear": {
            "type": "integer",
            "format": "int32"
          },
          "startingMonth": {
            "type": "integer",
            "format": "int32"
          },
          "endingYear": {
            "type": "integer",
            "format": "int32"
          },
          "endingMonth": {
            "type": "integer",
            "format": "int32"
          },
          "ageRating": {
            "$ref": "#/components/schemas/AgeRating"
          },
          "ownerUserName": {
            "type": "string",
            "nullable": true
          },
          "sourcePath": {
            "type": "string",
            "nullable": true
          },
          "downloadUrl": {
            "type": "string",
            "nullable": true
          },
          "shaHash": {
            "type": "string",
            "nullable": true
          },
          "provider": {
            "$ref": "#/components/schemas/ReadingListProvider"
          },
          "lastSyncCheckUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lastSyncedUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "totalItemsAtImport": {
            "type": "integer",
            "format": "int32"
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ReadingListTagDto"
            },
            "nullable": true
          },
          "canSync": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ReadingListFilterDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "statements": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ReadingListFilterStatementDto"
            },
            "nullable": true
          },
          "combination": {
            "$ref": "#/components/schemas/FilterCombination"
          },
          "sortOptions": {
            "$ref": "#/components/schemas/ReadingListSortOptionDto"
          },
          "entityType": {
            "$ref": "#/components/schemas/FilterEntityType"
          },
          "limitTo": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ReadingListFilterField": {
        "enum": [
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Title\n- `2` — ReleaseYear\n- `3` — ItemCount\n- `4` — Tags\n- `5` — Writer\n- `6` — Artist\n- `7` — Provider\n- `8` — MissingItemCount",
        "format": "int32",
        "x-enum-varnames": [
          "Title",
          "ReleaseYear",
          "ItemCount",
          "Tags",
          "Writer",
          "Artist",
          "Provider",
          "MissingItemCount"
        ],
        "x-enum-descriptions": [
          "Title",
          "ReleaseYear",
          "ItemCount",
          "Tags",
          "Writer",
          "Artist",
          "Provider",
          "MissingItemCount"
        ]
      },
      "ReadingListFilterStatementDto": {
        "type": "object",
        "properties": {
          "comparison": {
            "$ref": "#/components/schemas/FilterComparison"
          },
          "field": {
            "$ref": "#/components/schemas/ReadingListFilterField"
          },
          "value": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ReadingListInfoDto": {
        "type": "object",
        "properties": {
          "pages": {
            "type": "integer",
            "format": "int32"
          },
          "wordCount": {
            "type": "integer",
            "format": "int64"
          },
          "isAllEpub": {
            "type": "boolean"
          },
          "minHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "maxHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "avgHoursToRead": {
            "type": "number",
            "format": "float"
          }
        },
        "additionalProperties": false
      },
      "ReadingListItemChapterDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "range": {
            "type": "string",
            "nullable": true
          },
          "titleName": {
            "type": "string",
            "nullable": true
          },
          "minNumber": {
            "type": "number",
            "format": "float"
          },
          "maxNumber": {
            "type": "number",
            "format": "float"
          },
          "sortOrder": {
            "type": "number",
            "format": "float"
          },
          "pages": {
            "type": "integer",
            "format": "int32"
          },
          "isSpecial": {
            "type": "boolean"
          },
          "releaseDate": {
            "type": "string",
            "format": "date-time"
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "writerName": {
            "type": "string",
            "nullable": true
          },
          "writerId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "pencillerName": {
            "type": "string",
            "nullable": true
          },
          "pencillerId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ReadingListItemDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "order": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "seriesSortName": {
            "type": "string",
            "nullable": true
          },
          "seriesFormat": {
            "$ref": "#/components/schemas/MangaFormat"
          },
          "pagesRead": {
            "type": "integer",
            "format": "int32"
          },
          "pagesTotal": {
            "type": "integer",
            "format": "int32",
            "deprecated": true
          },
          "chapterNumber": {
            "type": "string",
            "nullable": true,
            "deprecated": true
          },
          "volumeNumber": {
            "type": "string",
            "nullable": true,
            "deprecated": true
          },
          "chapterTitleName": {
            "type": "string",
            "nullable": true,
            "deprecated": true
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "libraryType": {
            "$ref": "#/components/schemas/LibraryType"
          },
          "libraryName": {
            "type": "string",
            "nullable": true
          },
          "releaseDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "deprecated": true
          },
          "readingListId": {
            "type": "integer",
            "format": "int32"
          },
          "lastReadingProgressUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "fileSize": {
            "type": "integer",
            "format": "int64",
            "deprecated": true
          },
          "summary": {
            "type": "string",
            "nullable": true,
            "deprecated": true
          },
          "isSpecial": {
            "type": "boolean",
            "deprecated": true
          },
          "chapter": {
            "$ref": "#/components/schemas/ReadingListItemChapterDto"
          },
          "volume": {
            "$ref": "#/components/schemas/ReadingListItemVolumeDto"
          }
        },
        "additionalProperties": false
      },
      "ReadingListItemVolumeDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "minNumber": {
            "type": "number",
            "format": "float"
          },
          "maxNumber": {
            "type": "number",
            "format": "float"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ReadingListProvider": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "description": "Members:\n- `0` — File (None)\n- `1` — File\n- `2` — Url",
        "format": "int32",
        "x-enum-varnames": [
          "None",
          "File",
          "Url"
        ],
        "x-enum-descriptions": [
          "File",
          "File",
          "Url"
        ]
      },
      "ReadingListSortField": {
        "enum": [
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Title\n- `2` — ReleaseYearStart\n- `3` — ReleaseYearEnd\n- `4` — ItemCount",
        "format": "int32",
        "x-enum-varnames": [
          "Title",
          "ReleaseYearStart",
          "ReleaseYearEnd",
          "ItemCount"
        ],
        "x-enum-descriptions": [
          "Title",
          "ReleaseYearStart",
          "ReleaseYearEnd",
          "ItemCount"
        ]
      },
      "ReadingListSortOptionDto": {
        "type": "object",
        "properties": {
          "sortField": {
            "$ref": "#/components/schemas/ReadingListSortField"
          },
          "isAscending": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ReadingListTagDto": {
        "required": [
          "normalizedTitle",
          "title"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "normalizedTitle": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ReadingPaceDto": {
        "type": "object",
        "properties": {
          "hoursRead": {
            "type": "integer",
            "format": "int32"
          },
          "pagesRead": {
            "type": "integer",
            "format": "int32"
          },
          "wordsRead": {
            "type": "integer",
            "format": "int32"
          },
          "booksRead": {
            "type": "integer",
            "format": "int32"
          },
          "comicsRead": {
            "type": "integer",
            "format": "int32"
          },
          "daysInRange": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ReadingProfileKind": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Default\n- `1` — User\n- `2` — Implicit",
        "format": "int32",
        "x-enum-varnames": [
          "Default",
          "User",
          "Implicit"
        ],
        "x-enum-descriptions": [
          "Default",
          "User",
          "Implicit"
        ]
      },
      "ReadingSessionDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "startTimeUtc": {
            "type": "string",
            "format": "date-time"
          },
          "endTimeUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "isActive": {
            "type": "boolean"
          },
          "activityData": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ReadingActivityDataDto"
            },
            "nullable": true
          },
          "userId": {
            "type": "integer",
            "format": "int32"
          },
          "username": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RecommendationDto": {
        "type": "object",
        "properties": {
          "ownedSeries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RecommendedSeriesDto"
            },
            "nullable": true
          },
          "externalSeries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExternalSeriesDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RecommendationSource": {
        "enum": [
          1,
          2,
          3
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Similar\n- `2` — UserBased\n- `3` — Personalized",
        "format": "int32",
        "x-enum-varnames": [
          "Similar",
          "UserBased",
          "Personalized"
        ],
        "x-enum-descriptions": [
          "Similar",
          "UserBased",
          "Personalized"
        ]
      },
      "RecommendedSeriesDto": {
        "required": [
          "series"
        ],
        "type": "object",
        "properties": {
          "series": {
            "$ref": "#/components/schemas/SeriesDto"
          },
          "source": {
            "$ref": "#/components/schemas/RecommendationSource"
          }
        },
        "additionalProperties": false
      },
      "RefreshSeriesDto": {
        "type": "object",
        "properties": {
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "forceUpdate": {
            "type": "boolean"
          },
          "forceColorscape": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "RegisterDto": {
        "required": [
          "password",
          "username"
        ],
        "type": "object",
        "properties": {
          "username": {
            "minLength": 1,
            "type": "string"
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "password": {
            "maxLength": 256,
            "minLength": 6,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "RelatedSeriesDto": {
        "type": "object",
        "properties": {
          "sourceSeriesId": {
            "type": "integer",
            "format": "int32"
          },
          "sequels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "prequels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "spinOffs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "adaptations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "sideStories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "characters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "contains": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "others": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "alternativeSettings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "alternativeVersions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "doujinshis": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "parent": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "editions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "annuals": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          },
          "cameos": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RelationKind": {
        "enum": [
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8,
          9,
          10,
          11,
          12,
          13,
          14,
          16
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Prequel\n- `2` — Sequel\n- `3` — Spin Off (SpinOff)\n- `4` — Adaptation\n- `5` — Side Story (SideStory)\n- `6` — Character\n- `7` — Contains\n- `8` — Other\n- `9` — Alternative Setting (AlternativeSetting)\n- `10` — Alternative Version (AlternativeVersion)\n- `11` — Doujinshi\n- `12` — Parent\n- `13` — Edition\n- `14` — Annual\n- `16` — Cameo",
        "format": "int32",
        "x-enum-varnames": [
          "Prequel",
          "Sequel",
          "SpinOff",
          "Adaptation",
          "SideStory",
          "Character",
          "Contains",
          "Other",
          "AlternativeSetting",
          "AlternativeVersion",
          "Doujinshi",
          "Parent",
          "Edition",
          "Annual",
          "Cameo"
        ],
        "x-enum-descriptions": [
          "Prequel",
          "Sequel",
          "Spin Off",
          "Adaptation",
          "Side Story",
          "Character",
          "Contains",
          "Other",
          "Alternative Setting",
          "Alternative Version",
          "Doujinshi",
          "Parent",
          "Edition",
          "Annual",
          "Cameo"
        ]
      },
      "RemapRuleDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "normalizedCblSeriesName": {
            "type": "string",
            "nullable": true
          },
          "cblSeriesName": {
            "type": "string",
            "nullable": true
          },
          "cblVolume": {
            "type": "string",
            "nullable": true
          },
          "cblNumber": {
            "type": "string",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "volumeNumber": {
            "type": "string",
            "nullable": true
          },
          "chapterId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "kind": {
            "$ref": "#/components/schemas/CblRemapRuleKind"
          },
          "chapterRange": {
            "type": "string",
            "nullable": true
          },
          "chapterTitleName": {
            "type": "string",
            "nullable": true
          },
          "chapterIsSpecial": {
            "type": "boolean"
          },
          "libraryType": {
            "$ref": "#/components/schemas/LibraryType"
          },
          "seriesNameAtMapping": {
            "type": "string",
            "nullable": true
          },
          "appUserId": {
            "type": "integer",
            "format": "int32"
          },
          "isGlobal": {
            "type": "boolean"
          },
          "createdByUserName": {
            "type": "string",
            "nullable": true
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "RemoveBookmarkForSeriesDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "RenewKavitaPlusLicenseDto": {
        "required": [
          "billingInterval",
          "email"
        ],
        "type": "object",
        "properties": {
          "email": {
            "minLength": 1,
            "type": "string",
            "format": "email"
          },
          "billingInterval": {
            "$ref": "#/components/schemas/KavitaPlusBillingInterval"
          }
        },
        "additionalProperties": false
      },
      "RereadChapterDto": {
        "type": "object",
        "properties": {
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "label": {
            "type": "string",
            "nullable": true
          },
          "format": {
            "$ref": "#/components/schemas/MangaFormat"
          }
        },
        "additionalProperties": false
      },
      "RereadDto": {
        "required": [
          "shouldPrompt"
        ],
        "type": "object",
        "properties": {
          "shouldPrompt": {
            "type": "boolean"
          },
          "timePrompt": {
            "type": "boolean"
          },
          "fullReread": {
            "type": "boolean"
          },
          "daysSinceLastRead": {
            "type": "integer",
            "format": "int32"
          },
          "chapterOnContinue": {
            "$ref": "#/components/schemas/RereadChapterDto"
          },
          "chapterOnReread": {
            "$ref": "#/components/schemas/RereadChapterDto"
          }
        },
        "additionalProperties": false
      },
      "ResetPasswordDto": {
        "required": [
          "password",
          "userName"
        ],
        "type": "object",
        "properties": {
          "userName": {
            "minLength": 1,
            "type": "string"
          },
          "password": {
            "maxLength": 256,
            "minLength": 6,
            "type": "string"
          },
          "oldPassword": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ReviewScrobbleTarget": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Private\n- `1` — Friends\n- `2` — Public",
        "format": "int32",
        "x-enum-varnames": [
          "Private",
          "Friends",
          "Public"
        ],
        "x-enum-descriptions": [
          "Private",
          "Friends",
          "Public"
        ]
      },
      "RgbaColor": {
        "type": "object",
        "properties": {
          "r": {
            "type": "integer",
            "format": "int32"
          },
          "g": {
            "type": "integer",
            "format": "int32"
          },
          "b": {
            "type": "integer",
            "format": "int32"
          },
          "a": {
            "type": "number",
            "format": "float"
          }
        },
        "additionalProperties": false
      },
      "RotateAuthKeyRequestDto": {
        "required": [
          "keyLength",
          "name"
        ],
        "type": "object",
        "properties": {
          "keyLength": {
            "maximum": 32,
            "minimum": 8,
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "minLength": 1,
            "type": "string"
          },
          "expiresUtc": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RunMetadataMappingsRequestDto": {
        "type": "object",
        "properties": {
          "allLibraries": {
            "type": "boolean"
          },
          "includedLibraries": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "excludedLibraries": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ScalingOption": {
        "enum": [
          0,
          1,
          2,
          3
        ],
        "type": "integer",
        "description": "Members:\n- `0` — FitToHeight\n- `1` — FitToWidth\n- `2` — Original\n- `3` — Automatic",
        "format": "int32",
        "x-enum-varnames": [
          "FitToHeight",
          "FitToWidth",
          "Original",
          "Automatic"
        ],
        "x-enum-descriptions": [
          "FitToHeight",
          "FitToWidth",
          "Original",
          "Automatic"
        ]
      },
      "ScanFolderDto": {
        "type": "object",
        "properties": {
          "apiKey": {
            "type": "string",
            "nullable": true
          },
          "folderPath": {
            "type": "string",
            "nullable": true
          },
          "abortOnNoSeriesMatch": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ScrobbleErrorDto": {
        "type": "object",
        "properties": {
          "comment": {
            "type": "string",
            "nullable": true
          },
          "details": {
            "type": "string",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "ScrobbleEventDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int64"
          },
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "isProcessed": {
            "type": "boolean"
          },
          "volumeNumber": {
            "type": "number",
            "format": "float",
            "nullable": true
          },
          "chapterNumber": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "rating": {
            "type": "number",
            "format": "float",
            "nullable": true
          },
          "readStatus": {
            "$ref": "#/components/schemas/ScrobbleReadStatus"
          },
          "scrobbleEventType": {
            "$ref": "#/components/schemas/ScrobbleEventType"
          },
          "scrobbleProvider": {
            "$ref": "#/components/schemas/ScrobbleProvider"
          },
          "isErrored": {
            "type": "boolean"
          },
          "errorDetails": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ScrobbleEventFilter": {
        "type": "object",
        "properties": {
          "field": {
            "$ref": "#/components/schemas/ScrobbleEventSortField"
          },
          "isDescending": {
            "type": "boolean"
          },
          "query": {
            "type": "string",
            "nullable": true
          },
          "includeReviews": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ScrobbleEventSortField": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5,
          6
        ],
        "type": "integer",
        "description": "Members:\n- `0` — None\n- `1` — Created\n- `2` — LastModified\n- `3` — Type\n- `4` — Series\n- `5` — IsProcessed\n- `6` — ScrobbleEventFilter",
        "format": "int32",
        "x-enum-varnames": [
          "None",
          "Created",
          "LastModified",
          "Type",
          "Series",
          "IsProcessed",
          "ScrobbleEventFilter"
        ],
        "x-enum-descriptions": [
          "None",
          "Created",
          "LastModified",
          "Type",
          "Series",
          "IsProcessed",
          "ScrobbleEventFilter"
        ]
      },
      "ScrobbleEventType": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Chapter Read (ChapterRead)\n- `1` — Add to Want to Read (AddWantToRead)\n- `2` — Remove from Want to Read (RemoveWantToRead)\n- `3` — Score Updated (ScoreUpdated)\n- `4` — Review Added/Updated (Review)\n- `5` — Read status Updated (ReadStatusUpdate)",
        "format": "int32",
        "x-enum-varnames": [
          "ChapterRead",
          "AddWantToRead",
          "RemoveWantToRead",
          "ScoreUpdated",
          "Review",
          "ReadStatusUpdate"
        ],
        "x-enum-descriptions": [
          "Chapter Read",
          "Add to Want to Read",
          "Remove from Want to Read",
          "Score Updated",
          "Review Added/Updated",
          "Read status Updated"
        ]
      },
      "ScrobbleHoldDto": {
        "type": "object",
        "properties": {
          "seriesName": {
            "type": "string",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "ScrobbleProvider": {
        "enum": [
          0,
          1,
          2,
          4,
          5,
          6
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Kavita\n- `1` — AniList\n- `2` — Mal\n- `4` — Cbr\n- `5` — Hardcover\n- `6` — MangaBaka",
        "format": "int32",
        "x-enum-varnames": [
          "Kavita",
          "AniList",
          "Mal",
          "Cbr",
          "Hardcover",
          "MangaBaka"
        ],
        "x-enum-descriptions": [
          "Kavita",
          "AniList",
          "Mal",
          "Cbr",
          "Hardcover",
          "MangaBaka"
        ]
      },
      "ScrobbleProviderDto": {
        "type": "object",
        "properties": {
          "provider": {
            "$ref": "#/components/schemas/ScrobbleProvider"
          },
          "userName": {
            "type": "string",
            "nullable": true
          },
          "authenticationToken": {
            "type": "string",
            "nullable": true
          },
          "refreshToken": {
            "type": "string",
            "nullable": true
          },
          "validUntilUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastSyncedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "hasRunScrobbleEventGeneration": {
            "type": "boolean"
          },
          "scrobbleEventGenerationRan": {
            "type": "string",
            "format": "date-time"
          },
          "settings": {
            "$ref": "#/components/schemas/ScrobbleProviderSettingsDto"
          }
        },
        "additionalProperties": false
      },
      "ScrobbleProviderSettingsDto": {
        "type": "object",
        "properties": {
          "progressScrobbling": {
            "type": "boolean"
          },
          "wantToReadSync": {
            "type": "boolean"
          },
          "ratingScrobbling": {
            "type": "boolean"
          },
          "reviewsScrobbling": {
            "type": "boolean"
          },
          "reviewScrobbleTarget": {
            "$ref": "#/components/schemas/ReviewScrobbleTarget"
          },
          "allLibraries": {
            "type": "boolean"
          },
          "libraries": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "highestAgeRating": {
            "$ref": "#/components/schemas/AgeRating"
          },
          "inactiveSeriesRule": {
            "$ref": "#/components/schemas/ReadStatusTransitionRule"
          },
          "droppedSeriesRule": {
            "$ref": "#/components/schemas/ReadStatusTransitionRule"
          }
        },
        "additionalProperties": false
      },
      "ScrobbleReadStatus": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Ignore\n- `1` — Want to Read (WantToRead)\n- `2` — Read\n- `3` — Un read (UnRead)\n- `4` — Dropped\n- `5` — On hold (OnHold)",
        "format": "int32",
        "x-enum-varnames": [
          "Ignore",
          "WantToRead",
          "Read",
          "UnRead",
          "Dropped",
          "OnHold"
        ],
        "x-enum-descriptions": [
          "Ignore",
          "Want to Read",
          "Read",
          "Un read",
          "Dropped",
          "On hold"
        ]
      },
      "SearchResultDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "originalName": {
            "type": "string",
            "nullable": true
          },
          "sortName": {
            "type": "string",
            "nullable": true
          },
          "localizedName": {
            "type": "string",
            "nullable": true
          },
          "format": {
            "$ref": "#/components/schemas/MangaFormat"
          },
          "libraryName": {
            "type": "string",
            "nullable": true
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "releaseYear": {
            "type": "integer",
            "format": "int32"
          },
          "volumeCount": {
            "type": "integer",
            "format": "int32"
          },
          "chapterCount": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "SearchResultGroupDto": {
        "type": "object",
        "properties": {
          "libraries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LibraryDto"
            },
            "nullable": true
          },
          "series": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SearchResultDto"
            },
            "nullable": true
          },
          "collections": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppUserCollectionDto"
            },
            "nullable": true
          },
          "readingLists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ReadingListDto"
            },
            "nullable": true
          },
          "persons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "genres": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GenreTagDto"
            },
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TagDto"
            },
            "nullable": true
          },
          "files": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MangaFileDto"
            },
            "nullable": true
          },
          "chapters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChapterDto"
            },
            "nullable": true
          },
          "bookmarks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookmarkSearchResultDto"
            },
            "nullable": true
          },
          "annotations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AnnotationDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SendSeriesToEmailDeviceDto": {
        "type": "object",
        "properties": {
          "deviceId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "SendToEmailDeviceDto": {
        "type": "object",
        "properties": {
          "deviceId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SeriesByIdsDto": {
        "type": "object",
        "properties": {
          "seriesIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SeriesCharacter": {
        "required": [
          "description",
          "url"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "url": {
            "type": "string",
            "nullable": true
          },
          "imageUrl": {
            "type": "string",
            "nullable": true
          },
          "role": {
            "$ref": "#/components/schemas/CharacterRole"
          }
        },
        "additionalProperties": false
      },
      "SeriesDetailDto": {
        "type": "object",
        "properties": {
          "specials": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChapterDto"
            },
            "nullable": true
          },
          "chapters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChapterDto"
            },
            "nullable": true
          },
          "volumes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VolumeDto"
            },
            "nullable": true
          },
          "storylineChapters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChapterDto"
            },
            "nullable": true
          },
          "libraryType": {
            "$ref": "#/components/schemas/LibraryType"
          },
          "unreadCount": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "SeriesDetailPlusDto": {
        "type": "object",
        "properties": {
          "recommendations": {
            "$ref": "#/components/schemas/RecommendationDto"
          },
          "reviews": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UserReviewDto"
            },
            "nullable": true
          },
          "ratings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RatingDto"
            },
            "nullable": true
          },
          "series": {
            "$ref": "#/components/schemas/ExternalSeriesDetailDto"
          }
        },
        "additionalProperties": false
      },
      "SeriesDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "originalName": {
            "type": "string",
            "nullable": true
          },
          "localizedName": {
            "type": "string",
            "nullable": true
          },
          "sortName": {
            "type": "string",
            "nullable": true
          },
          "pages": {
            "type": "integer",
            "format": "int32"
          },
          "coverImageLocked": {
            "type": "boolean"
          },
          "lastChapterAdded": {
            "type": "string",
            "format": "date-time"
          },
          "lastChapterAddedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "userRating": {
            "type": "number",
            "format": "float"
          },
          "hasUserRated": {
            "type": "boolean"
          },
          "totalReads": {
            "type": "integer",
            "format": "int32"
          },
          "pagesRead": {
            "type": "integer",
            "format": "int32"
          },
          "latestReadDate": {
            "type": "string",
            "format": "date-time"
          },
          "format": {
            "$ref": "#/components/schemas/MangaFormat"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "sortNameLocked": {
            "type": "boolean"
          },
          "localizedNameLocked": {
            "type": "boolean"
          },
          "nameLocked": {
            "type": "boolean"
          },
          "wordCount": {
            "type": "integer",
            "format": "int64"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryName": {
            "type": "string",
            "nullable": true
          },
          "minHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "maxHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "avgHoursToRead": {
            "type": "number",
            "format": "float"
          },
          "folderPath": {
            "type": "string",
            "nullable": true
          },
          "lowestFolderPath": {
            "type": "string",
            "nullable": true
          },
          "lastFolderScanned": {
            "type": "string",
            "format": "date-time"
          },
          "dontMatch": {
            "type": "boolean"
          },
          "isBlacklisted": {
            "type": "boolean"
          },
          "isStandAlone": {
            "type": "boolean"
          },
          "coverImage": {
            "type": "string",
            "nullable": true
          },
          "primaryColor": {
            "type": "string",
            "nullable": true
          },
          "secondaryColor": {
            "type": "string",
            "nullable": true
          },
          "aniListId": {
            "type": "integer",
            "format": "int32"
          },
          "malId": {
            "type": "integer",
            "format": "int64"
          },
          "hardcoverId": {
            "type": "integer",
            "format": "int32"
          },
          "metronId": {
            "type": "integer",
            "format": "int64"
          },
          "comicVineId": {
            "type": "string",
            "nullable": true
          },
          "mangaBakaId": {
            "type": "integer",
            "format": "int64"
          },
          "mangaBakaEditionId": {
            "type": "string",
            "nullable": true
          },
          "cbrId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "SeriesDtoStatCount": {
        "type": "object",
        "properties": {
          "value": {
            "$ref": "#/components/schemas/SeriesDto"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "SeriesFilterField": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8,
          9,
          10,
          11,
          12,
          13,
          14,
          15,
          16,
          17,
          18,
          19,
          20,
          21,
          22,
          23,
          24,
          25,
          26,
          27,
          28,
          29,
          30,
          31,
          32,
          33,
          34
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Summary\n- `1` — SeriesName\n- `2` — PublicationStatus\n- `3` — Languages\n- `4` — AgeRating\n- `5` — UserRating\n- `6` — Tags\n- `7` — CollectionTags\n- `8` — Translators\n- `9` — Characters\n- `10` — Publisher\n- `11` — Editor\n- `12` — CoverArtist\n- `13` — Letterer\n- `14` — Colorist\n- `15` — Inker\n- `16` — Penciller\n- `17` — Writers\n- `18` — Genres\n- `19` — Libraries\n- `20` — ReadProgress\n- `21` — Formats\n- `22` — ReleaseYear\n- `23` — ReadTime\n- `24` — Path\n- `25` — FilePath\n- `26` — WantToRead\n- `27` — ReadingDate\n- `28` — AverageRating\n- `29` — Imprint\n- `30` — Team\n- `31` — Location\n- `32` — ReadLast\n- `33` — FileSize\n- `34` — CollapseSeriesRelationships",
        "format": "int32",
        "x-enum-varnames": [
          "Summary",
          "SeriesName",
          "PublicationStatus",
          "Languages",
          "AgeRating",
          "UserRating",
          "Tags",
          "CollectionTags",
          "Translators",
          "Characters",
          "Publisher",
          "Editor",
          "CoverArtist",
          "Letterer",
          "Colorist",
          "Inker",
          "Penciller",
          "Writers",
          "Genres",
          "Libraries",
          "ReadProgress",
          "Formats",
          "ReleaseYear",
          "ReadTime",
          "Path",
          "FilePath",
          "WantToRead",
          "ReadingDate",
          "AverageRating",
          "Imprint",
          "Team",
          "Location",
          "ReadLast",
          "FileSize",
          "CollapseSeriesRelationships"
        ],
        "x-enum-descriptions": [
          "Summary",
          "SeriesName",
          "PublicationStatus",
          "Languages",
          "AgeRating",
          "UserRating",
          "Tags",
          "CollectionTags",
          "Translators",
          "Characters",
          "Publisher",
          "Editor",
          "CoverArtist",
          "Letterer",
          "Colorist",
          "Inker",
          "Penciller",
          "Writers",
          "Genres",
          "Libraries",
          "ReadProgress",
          "Formats",
          "ReleaseYear",
          "ReadTime",
          "Path",
          "FilePath",
          "WantToRead",
          "ReadingDate",
          "AverageRating",
          "Imprint",
          "Team",
          "Location",
          "ReadLast",
          "FileSize",
          "CollapseSeriesRelationships"
        ]
      },
      "SeriesFilterStatementDto": {
        "type": "object",
        "properties": {
          "comparison": {
            "$ref": "#/components/schemas/FilterComparison"
          },
          "field": {
            "$ref": "#/components/schemas/SeriesFilterField"
          },
          "value": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SeriesFilterV2Dto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "statements": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeriesFilterStatementDto"
            },
            "nullable": true
          },
          "combination": {
            "$ref": "#/components/schemas/FilterCombination"
          },
          "sortOptions": {
            "$ref": "#/components/schemas/SeriesSortOptionDto"
          },
          "entityType": {
            "$ref": "#/components/schemas/FilterEntityType"
          },
          "limitTo": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "SeriesMetadataDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "genres": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GenreTagDto"
            },
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TagDto"
            },
            "nullable": true
          },
          "writers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "coverArtists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "publishers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "characters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "pencillers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "inkers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "imprints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "colorists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "letterers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "editors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "translators": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "teams": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "locations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "ageRating": {
            "$ref": "#/components/schemas/AgeRating"
          },
          "releaseYear": {
            "type": "integer",
            "format": "int32"
          },
          "language": {
            "type": "string",
            "nullable": true
          },
          "maxCount": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int32"
          },
          "publicationStatus": {
            "$ref": "#/components/schemas/PublicationStatus"
          },
          "webLinks": {
            "type": "string",
            "nullable": true
          },
          "languageLocked": {
            "type": "boolean"
          },
          "summaryLocked": {
            "type": "boolean"
          },
          "ageRatingLocked": {
            "type": "boolean"
          },
          "publicationStatusLocked": {
            "type": "boolean"
          },
          "genresLocked": {
            "type": "boolean"
          },
          "tagsLocked": {
            "type": "boolean"
          },
          "writerLocked": {
            "type": "boolean"
          },
          "characterLocked": {
            "type": "boolean"
          },
          "coloristLocked": {
            "type": "boolean"
          },
          "editorLocked": {
            "type": "boolean"
          },
          "inkerLocked": {
            "type": "boolean"
          },
          "imprintLocked": {
            "type": "boolean"
          },
          "lettererLocked": {
            "type": "boolean"
          },
          "pencillerLocked": {
            "type": "boolean"
          },
          "publisherLocked": {
            "type": "boolean"
          },
          "translatorLocked": {
            "type": "boolean"
          },
          "teamLocked": {
            "type": "boolean"
          },
          "locationLocked": {
            "type": "boolean"
          },
          "coverArtistLocked": {
            "type": "boolean"
          },
          "releaseYearLocked": {
            "type": "boolean"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "SeriesNameLanguageDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "localizedName": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SeriesRelationship": {
        "type": "object",
        "properties": {
          "aniListId": {
            "type": "integer",
            "format": "int32"
          },
          "malId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "mangabakaId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "seriesName": {
            "$ref": "#/components/schemas/ALMediaTitle"
          },
          "relation": {
            "$ref": "#/components/schemas/RelationKind"
          },
          "provider": {
            "$ref": "#/components/schemas/ScrobbleProvider"
          },
          "format": {
            "$ref": "#/components/schemas/PlusMediaFormat"
          },
          "series": {
            "$ref": "#/components/schemas/ExternalSeriesDetailDto"
          },
          "metadataProvider": {
            "$ref": "#/components/schemas/MetadataProvider"
          }
        },
        "additionalProperties": false
      },
      "SeriesSortField": {
        "enum": [
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8,
          9,
          10,
          11
        ],
        "type": "integer",
        "description": "Members:\n- `1` — SortName\n- `2` — CreatedDate\n- `3` — LastModifiedDate\n- `4` — LastChapterAdded\n- `5` — TimeToRead\n- `6` — ReleaseYear\n- `7` — ReadProgress\n- `8` — AverageRating\n- `9` — Random\n- `10` — UserRating\n- `11` — UnreadChapterCount",
        "format": "int32",
        "x-enum-varnames": [
          "SortName",
          "CreatedDate",
          "LastModifiedDate",
          "LastChapterAdded",
          "TimeToRead",
          "ReleaseYear",
          "ReadProgress",
          "AverageRating",
          "Random",
          "UserRating",
          "UnreadChapterCount"
        ],
        "x-enum-descriptions": [
          "SortName",
          "CreatedDate",
          "LastModifiedDate",
          "LastChapterAdded",
          "TimeToRead",
          "ReleaseYear",
          "ReadProgress",
          "AverageRating",
          "Random",
          "UserRating",
          "UnreadChapterCount"
        ]
      },
      "SeriesSortOptionDto": {
        "type": "object",
        "properties": {
          "sortField": {
            "$ref": "#/components/schemas/SeriesSortField"
          },
          "isAscending": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "SeriesStaffDto": {
        "required": [
          "name",
          "role",
          "url"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "url": {
            "type": "string",
            "nullable": true
          },
          "role": {
            "type": "string",
            "nullable": true
          },
          "imageUrl": {
            "type": "string",
            "nullable": true
          },
          "gender": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ServerInfoSlimDto": {
        "required": [
          "installId",
          "kavitaVersion"
        ],
        "type": "object",
        "properties": {
          "installId": {
            "type": "string",
            "nullable": true
          },
          "isDocker": {
            "type": "boolean"
          },
          "kavitaVersion": {
            "type": "string",
            "nullable": true
          },
          "firstInstallDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "firstInstallVersion": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ServerSettingDto": {
        "type": "object",
        "properties": {
          "cacheDirectory": {
            "type": "string",
            "nullable": true
          },
          "taskScan": {
            "type": "string",
            "nullable": true
          },
          "taskBackup": {
            "type": "string",
            "nullable": true
          },
          "taskCleanup": {
            "type": "string",
            "nullable": true
          },
          "taskCblSync": {
            "type": "string",
            "nullable": true
          },
          "loggingLevel": {
            "type": "string",
            "nullable": true
          },
          "port": {
            "type": "integer",
            "format": "int32"
          },
          "ipAddresses": {
            "type": "string",
            "nullable": true
          },
          "allowStatCollection": {
            "type": "boolean"
          },
          "enableOpds": {
            "type": "boolean"
          },
          "baseUrl": {
            "type": "string",
            "nullable": true
          },
          "bookmarksDirectory": {
            "type": "string",
            "nullable": true
          },
          "installVersion": {
            "type": "string",
            "nullable": true
          },
          "installId": {
            "type": "string",
            "nullable": true
          },
          "encodeMediaAs": {
            "$ref": "#/components/schemas/EncodeFormat"
          },
          "totalBackups": {
            "type": "integer",
            "format": "int32"
          },
          "enableFolderWatching": {
            "type": "boolean"
          },
          "totalLogs": {
            "type": "integer",
            "format": "int32"
          },
          "hostName": {
            "type": "string",
            "nullable": true
          },
          "cacheSize": {
            "type": "integer",
            "format": "int64"
          },
          "onDeckProgressDays": {
            "type": "integer",
            "format": "int32"
          },
          "onDeckUpdateDays": {
            "type": "integer",
            "format": "int32"
          },
          "coverImageSize": {
            "$ref": "#/components/schemas/CoverImageSize"
          },
          "pdfRenderResolution": {
            "$ref": "#/components/schemas/PdfRenderResolution"
          },
          "smtpConfig": {
            "$ref": "#/components/schemas/SmtpConfigDto"
          },
          "oidcConfig": {
            "$ref": "#/components/schemas/OidcConfigDto"
          },
          "firstInstallDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "firstInstallVersion": {
            "type": "string",
            "nullable": true
          },
          "statsApiHits": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ServerStatisticsDto": {
        "type": "object",
        "properties": {
          "chapterCount": {
            "type": "integer",
            "format": "int64"
          },
          "volumeCount": {
            "type": "integer",
            "format": "int64"
          },
          "seriesCount": {
            "type": "integer",
            "format": "int64"
          },
          "totalFiles": {
            "type": "integer",
            "format": "int64"
          },
          "totalSize": {
            "type": "integer",
            "format": "int64"
          },
          "totalGenres": {
            "type": "integer",
            "format": "int64"
          },
          "totalTags": {
            "type": "integer",
            "format": "int64"
          },
          "totalPeople": {
            "type": "integer",
            "format": "int64"
          },
          "totalReadingTime": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "SideNavStreamDto": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "isProvided": {
            "type": "boolean"
          },
          "order": {
            "type": "integer",
            "format": "int32"
          },
          "smartFilterEncoded": {
            "type": "string",
            "nullable": true
          },
          "smartFilterId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "externalSourceId": {
            "type": "integer",
            "format": "int32"
          },
          "externalSource": {
            "$ref": "#/components/schemas/ExternalSourceDto"
          },
          "streamType": {
            "$ref": "#/components/schemas/SideNavStreamType"
          },
          "visible": {
            "type": "boolean"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "library": {
            "$ref": "#/components/schemas/LibraryDto"
          },
          "entityType": {
            "$ref": "#/components/schemas/FilterEntityType"
          }
        },
        "additionalProperties": false
      },
      "SideNavStreamType": {
        "enum": [
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8,
          9
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Collections\n- `2` — ReadingLists\n- `3` — Bookmarks\n- `4` — Library\n- `5` — SmartFilter\n- `6` — ExternalSource\n- `7` — AllSeries\n- `8` — WantToRead\n- `9` — BrowsePeople",
        "format": "int32",
        "x-enum-varnames": [
          "Collections",
          "ReadingLists",
          "Bookmarks",
          "Library",
          "SmartFilter",
          "ExternalSource",
          "AllSeries",
          "WantToRead",
          "BrowsePeople"
        ],
        "x-enum-descriptions": [
          "Collections",
          "ReadingLists",
          "Bookmarks",
          "Library",
          "SmartFilter",
          "ExternalSource",
          "AllSeries",
          "WantToRead",
          "BrowsePeople"
        ]
      },
      "SiteThemeDto": {
        "required": [
          "fileName",
          "name",
          "normalizedName"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "normalizedName": {
            "type": "string",
            "nullable": true
          },
          "fileName": {
            "type": "string",
            "nullable": true
          },
          "isDefault": {
            "type": "boolean"
          },
          "provider": {
            "$ref": "#/components/schemas/ThemeProvider"
          },
          "previewUrls": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "author": {
            "type": "string",
            "nullable": true
          },
          "compatibleVersion": {
            "type": "string",
            "nullable": true
          },
          "selector": {
            "type": "string",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false
      },
      "SmartFilterDto": {
        "required": [
          "entityType",
          "filter",
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "filter": {
            "type": "string",
            "nullable": true
          },
          "entityType": {
            "$ref": "#/components/schemas/FilterEntityType"
          }
        },
        "additionalProperties": false
      },
      "SmtpConfigDto": {
        "type": "object",
        "properties": {
          "senderAddress": {
            "type": "string",
            "nullable": true
          },
          "senderDisplayName": {
            "type": "string",
            "nullable": true
          },
          "userName": {
            "type": "string",
            "nullable": true
          },
          "password": {
            "type": "string",
            "nullable": true
          },
          "host": {
            "type": "string",
            "nullable": true
          },
          "port": {
            "type": "integer",
            "format": "int32"
          },
          "enableSsl": {
            "type": "boolean"
          },
          "sizeLimit": {
            "type": "integer",
            "format": "int32"
          },
          "customizedTemplates": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "SpreadStatsDto": {
        "type": "object",
        "properties": {
          "buckets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StatBucketDto"
            },
            "nullable": true
          },
          "totalCount": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "StandaloneChapterDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "range": {
            "type": "string",
            "nullable": true
          },
          "number": {
            "type": "string",
            "nullable": true,
            "deprecated": true
          },
          "minNumber": {
            "type": "number",
            "format": "float"
          },
          "maxNumber": {
            "type": "number",
            "format": "float"
          },
          "sortOrder": {
            "type": "number",
            "format": "float"
          },
          "pages": {
            "type": "integer",
            "format": "int32"
          },
          "isSpecial": {
            "type": "boolean"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "files": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MangaFileDto"
            },
            "nullable": true
          },
          "pagesRead": {
            "type": "integer",
            "format": "int32"
          },
          "totalReads": {
            "type": "integer",
            "format": "int32"
          },
          "lastReadingProgressUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastReadingProgress": {
            "type": "string",
            "format": "date-time"
          },
          "coverImageLocked": {
            "type": "boolean"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "releaseDate": {
            "type": "string",
            "format": "date-time"
          },
          "titleName": {
            "type": "string",
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "ageRating": {
            "$ref": "#/components/schemas/AgeRating"
          },
          "wordCount": {
            "type": "integer",
            "format": "int64"
          },
          "minHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "maxHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "avgHoursToRead": {
            "type": "number",
            "format": "float"
          },
          "webLinks": {
            "type": "string",
            "nullable": true
          },
          "isbn": {
            "type": "string",
            "nullable": true
          },
          "writers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "coverArtists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "publishers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "characters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "pencillers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "inkers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "imprints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "colorists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "letterers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "editors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "translators": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "teams": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "locations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "genres": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GenreTagDto"
            },
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TagDto"
            },
            "nullable": true
          },
          "publicationStatus": {
            "$ref": "#/components/schemas/PublicationStatus"
          },
          "language": {
            "type": "string",
            "nullable": true
          },
          "count": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int32"
          },
          "languageLocked": {
            "type": "boolean"
          },
          "summaryLocked": {
            "type": "boolean"
          },
          "ageRatingLocked": {
            "type": "boolean"
          },
          "publicationStatusLocked": {
            "type": "boolean"
          },
          "genresLocked": {
            "type": "boolean"
          },
          "tagsLocked": {
            "type": "boolean"
          },
          "writerLocked": {
            "type": "boolean"
          },
          "characterLocked": {
            "type": "boolean"
          },
          "coloristLocked": {
            "type": "boolean"
          },
          "editorLocked": {
            "type": "boolean"
          },
          "inkerLocked": {
            "type": "boolean"
          },
          "imprintLocked": {
            "type": "boolean"
          },
          "lettererLocked": {
            "type": "boolean"
          },
          "pencillerLocked": {
            "type": "boolean"
          },
          "publisherLocked": {
            "type": "boolean"
          },
          "translatorLocked": {
            "type": "boolean"
          },
          "teamLocked": {
            "type": "boolean"
          },
          "locationLocked": {
            "type": "boolean"
          },
          "coverArtistLocked": {
            "type": "boolean"
          },
          "releaseDateLocked": {
            "type": "boolean"
          },
          "titleNameLocked": {
            "type": "boolean"
          },
          "sortOrderLocked": {
            "type": "boolean"
          },
          "coverImage": {
            "type": "string",
            "nullable": true
          },
          "primaryColor": {
            "type": "string",
            "nullable": true
          },
          "secondaryColor": {
            "type": "string",
            "nullable": true
          },
          "format": {
            "$ref": "#/components/schemas/MangaFormat"
          },
          "aniListId": {
            "type": "integer",
            "format": "int32"
          },
          "malId": {
            "type": "integer",
            "format": "int64"
          },
          "hardcoverId": {
            "type": "integer",
            "format": "int32"
          },
          "metronId": {
            "type": "integer",
            "format": "int64"
          },
          "comicVineId": {
            "type": "string",
            "nullable": true
          },
          "mangaBakaId": {
            "type": "integer",
            "format": "int64"
          },
          "cbrId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "libraryType": {
            "$ref": "#/components/schemas/LibraryType"
          },
          "volumeTitle": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "StatBucketDto": {
        "type": "object",
        "properties": {
          "rangeStart": {
            "type": "integer",
            "format": "int32"
          },
          "rangeEnd": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "count": {
            "type": "integer",
            "format": "int32"
          },
          "percentage": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "StringBreakDownDto": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StringStatCount"
            },
            "nullable": true
          },
          "total": {
            "type": "integer",
            "format": "int32"
          },
          "totalOptions": {
            "type": "integer",
            "format": "int32"
          },
          "missing": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "StringStatCount": {
        "type": "object",
        "properties": {
          "value": {
            "type": "string",
            "nullable": true
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "TachiyomiChapterDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "range": {
            "type": "string",
            "nullable": true
          },
          "minNumber": {
            "type": "number",
            "format": "float"
          },
          "maxNumber": {
            "type": "number",
            "format": "float"
          },
          "sortOrder": {
            "type": "number",
            "format": "float"
          },
          "pages": {
            "type": "integer",
            "format": "int32"
          },
          "isSpecial": {
            "type": "boolean"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "files": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MangaFileDto"
            },
            "nullable": true
          },
          "pagesRead": {
            "type": "integer",
            "format": "int32"
          },
          "totalReads": {
            "type": "integer",
            "format": "int32"
          },
          "lastReadingProgressUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastReadingProgress": {
            "type": "string",
            "format": "date-time"
          },
          "coverImageLocked": {
            "type": "boolean"
          },
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "releaseDate": {
            "type": "string",
            "format": "date-time"
          },
          "titleName": {
            "type": "string",
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "ageRating": {
            "$ref": "#/components/schemas/AgeRating"
          },
          "wordCount": {
            "type": "integer",
            "format": "int64"
          },
          "volumeTitle": {
            "type": "string",
            "nullable": true
          },
          "minHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "maxHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "avgHoursToRead": {
            "type": "number",
            "format": "float"
          },
          "webLinks": {
            "type": "string",
            "nullable": true
          },
          "isbn": {
            "type": "string",
            "nullable": true
          },
          "writers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "coverArtists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "publishers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "characters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "pencillers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "inkers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "imprints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "colorists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "letterers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "editors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "translators": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "teams": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "locations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "genres": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GenreTagDto"
            },
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TagDto"
            },
            "nullable": true
          },
          "publicationStatus": {
            "$ref": "#/components/schemas/PublicationStatus"
          },
          "language": {
            "type": "string",
            "nullable": true
          },
          "count": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int32"
          },
          "languageLocked": {
            "type": "boolean"
          },
          "summaryLocked": {
            "type": "boolean"
          },
          "ageRatingLocked": {
            "type": "boolean"
          },
          "publicationStatusLocked": {
            "type": "boolean"
          },
          "genresLocked": {
            "type": "boolean"
          },
          "tagsLocked": {
            "type": "boolean"
          },
          "writerLocked": {
            "type": "boolean"
          },
          "characterLocked": {
            "type": "boolean"
          },
          "coloristLocked": {
            "type": "boolean"
          },
          "editorLocked": {
            "type": "boolean"
          },
          "inkerLocked": {
            "type": "boolean"
          },
          "imprintLocked": {
            "type": "boolean"
          },
          "lettererLocked": {
            "type": "boolean"
          },
          "pencillerLocked": {
            "type": "boolean"
          },
          "publisherLocked": {
            "type": "boolean"
          },
          "translatorLocked": {
            "type": "boolean"
          },
          "teamLocked": {
            "type": "boolean"
          },
          "locationLocked": {
            "type": "boolean"
          },
          "coverArtistLocked": {
            "type": "boolean"
          },
          "releaseDateLocked": {
            "type": "boolean"
          },
          "titleNameLocked": {
            "type": "boolean"
          },
          "sortOrderLocked": {
            "type": "boolean"
          },
          "coverImage": {
            "type": "string",
            "nullable": true
          },
          "primaryColor": {
            "type": "string",
            "nullable": true
          },
          "secondaryColor": {
            "type": "string",
            "nullable": true
          },
          "format": {
            "$ref": "#/components/schemas/MangaFormat"
          },
          "aniListId": {
            "type": "integer",
            "format": "int32"
          },
          "malId": {
            "type": "integer",
            "format": "int64"
          },
          "hardcoverId": {
            "type": "integer",
            "format": "int32"
          },
          "metronId": {
            "type": "integer",
            "format": "int64"
          },
          "comicVineId": {
            "type": "string",
            "nullable": true
          },
          "mangaBakaId": {
            "type": "integer",
            "format": "int64"
          },
          "cbrId": {
            "type": "integer",
            "format": "int32"
          },
          "number": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TagDto": {
        "required": [
          "title"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TagDtoStatCount": {
        "type": "object",
        "properties": {
          "value": {
            "$ref": "#/components/schemas/TagDto"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "TagWeight": {
        "enum": [
          1,
          2,
          3,
          4,
          5
        ],
        "type": "integer",
        "description": "Members:\n- `1` — Core\n- `2` — Defining\n- `3` — Recurrent\n- `4` — Incidental\n- `5` — Unweighted",
        "format": "int32",
        "x-enum-varnames": [
          "Core",
          "Defining",
          "Recurrent",
          "Incidental",
          "Unweighted"
        ],
        "x-enum-descriptions": [
          "Core",
          "Defining",
          "Recurrent",
          "Incidental",
          "Unweighted"
        ]
      },
      "ThemeProvider": {
        "enum": [
          1,
          2
        ],
        "type": "integer",
        "description": "Members:\n- `1` — System\n- `2` — Custom",
        "format": "int32",
        "x-enum-varnames": [
          "System",
          "Custom"
        ],
        "x-enum-descriptions": [
          "System",
          "Custom"
        ]
      },
      "TokenRequestDto": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "nullable": true
          },
          "refreshToken": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TokenValidityInfoDto": {
        "type": "object",
        "properties": {
          "provider": {
            "$ref": "#/components/schemas/ScrobbleProvider"
          },
          "validUntilUtc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "TopReadDto": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "integer",
            "format": "int32"
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "comicsTime": {
            "type": "number",
            "format": "float"
          },
          "booksTime": {
            "type": "number",
            "format": "float"
          },
          "mangaTime": {
            "type": "number",
            "format": "float"
          }
        },
        "additionalProperties": false
      },
      "UpdateAgeRestrictionDto": {
        "required": [
          "ageRating",
          "includeUnknowns"
        ],
        "type": "object",
        "properties": {
          "ageRating": {
            "$ref": "#/components/schemas/AgeRating"
          },
          "includeUnknowns": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "UpdateChapterDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "genres": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GenreTagDto"
            },
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TagDto"
            },
            "nullable": true
          },
          "writers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "coverArtists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "publishers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "characters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "pencillers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "inkers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "imprints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "colorists": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "letterers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "editors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "translators": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "teams": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "locations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "ageRating": {
            "$ref": "#/components/schemas/AgeRating"
          },
          "language": {
            "type": "string",
            "nullable": true
          },
          "ageRatingLocked": {
            "type": "boolean"
          },
          "titleNameLocked": {
            "type": "boolean"
          },
          "genresLocked": {
            "type": "boolean"
          },
          "tagsLocked": {
            "type": "boolean"
          },
          "writerLocked": {
            "type": "boolean"
          },
          "characterLocked": {
            "type": "boolean"
          },
          "coloristLocked": {
            "type": "boolean"
          },
          "editorLocked": {
            "type": "boolean"
          },
          "inkerLocked": {
            "type": "boolean"
          },
          "imprintLocked": {
            "type": "boolean"
          },
          "lettererLocked": {
            "type": "boolean"
          },
          "pencillerLocked": {
            "type": "boolean"
          },
          "publisherLocked": {
            "type": "boolean"
          },
          "translatorLocked": {
            "type": "boolean"
          },
          "teamLocked": {
            "type": "boolean"
          },
          "locationLocked": {
            "type": "boolean"
          },
          "coverArtistLocked": {
            "type": "boolean"
          },
          "languageLocked": {
            "type": "boolean"
          },
          "summaryLocked": {
            "type": "boolean"
          },
          "isbnLocked": {
            "type": "boolean"
          },
          "releaseDateLocked": {
            "type": "boolean"
          },
          "sortOrder": {
            "type": "number",
            "format": "float"
          },
          "sortOrderLocked": {
            "type": "boolean"
          },
          "webLinks": {
            "type": "string",
            "nullable": true
          },
          "isbn": {
            "type": "string",
            "nullable": true
          },
          "releaseDate": {
            "type": "string",
            "format": "date-time"
          },
          "titleName": {
            "type": "string",
            "nullable": true
          },
          "aniListId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "malId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "hardcoverId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "metronId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "comicVineId": {
            "type": "string",
            "nullable": true
          },
          "mangaBakaId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "cbrId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateClientDeviceNameDto": {
        "type": "object",
        "properties": {
          "deviceId": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateDefaultThemeDto": {
        "type": "object",
        "properties": {
          "themeId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "UpdateEmailDeviceDto": {
        "required": [
          "emailAddress",
          "id",
          "name",
          "platform"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "minLength": 1,
            "type": "string"
          },
          "platform": {
            "$ref": "#/components/schemas/EmailDevicePlatform"
          },
          "emailAddress": {
            "minLength": 1,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "UpdateEmailDto": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "nullable": true
          },
          "password": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateLibraryDto": {
        "required": [
          "allowMetadataMatching",
          "allowScrobbling",
          "enableMetadata",
          "excludePatterns",
          "fileGroupTypes",
          "folders",
          "folderWatching",
          "id",
          "includeInDashboard",
          "includeInSearch",
          "inheritWebLinksFromFirstChapter",
          "manageCollections",
          "manageReadingLists",
          "name",
          "removePrefixForSortName",
          "type"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "minLength": 1,
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/LibraryType"
          },
          "folders": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "folderWatching": {
            "type": "boolean"
          },
          "includeInDashboard": {
            "type": "boolean"
          },
          "includeInSearch": {
            "type": "boolean"
          },
          "manageCollections": {
            "type": "boolean"
          },
          "manageReadingLists": {
            "type": "boolean"
          },
          "allowScrobbling": {
            "type": "boolean"
          },
          "allowMetadataMatching": {
            "type": "boolean"
          },
          "enableMetadata": {
            "type": "boolean"
          },
          "removePrefixForSortName": {
            "type": "boolean"
          },
          "inheritWebLinksFromFirstChapter": {
            "type": "boolean"
          },
          "defaultLanguage": {
            "type": "string",
            "nullable": true
          },
          "metadataProvider": {
            "$ref": "#/components/schemas/MetadataProvider"
          },
          "fileGroupTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FileTypeGroup"
            }
          },
          "excludePatterns": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false
      },
      "UpdateLibraryForUserDto": {
        "required": [
          "selectedLibraries",
          "username"
        ],
        "type": "object",
        "properties": {
          "username": {
            "type": "string",
            "nullable": true
          },
          "selectedLibraries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LibraryDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateLicenseDto": {
        "required": [
          "email",
          "license"
        ],
        "type": "object",
        "properties": {
          "license": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "discordId": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateNotificationDto": {
        "required": [
          "currentVersion",
          "publishDate",
          "updateBody",
          "updateTitle",
          "updateUrl",
          "updateVersion"
        ],
        "type": "object",
        "properties": {
          "currentVersion": {
            "type": "string",
            "nullable": true
          },
          "updateVersion": {
            "type": "string",
            "nullable": true
          },
          "updateBody": {
            "type": "string",
            "nullable": true
          },
          "updateTitle": {
            "type": "string",
            "nullable": true
          },
          "updateUrl": {
            "type": "string",
            "nullable": true
          },
          "isDocker": {
            "type": "boolean"
          },
          "isPrerelease": {
            "type": "boolean"
          },
          "publishDate": {
            "type": "string",
            "nullable": true
          },
          "isOnNightlyInRelease": {
            "type": "boolean"
          },
          "isReleaseNewer": {
            "type": "boolean"
          },
          "isReleaseEqual": {
            "type": "boolean"
          },
          "added": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "removed": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "changed": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "fixed": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "theme": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "developer": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "api": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "featureRequests": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "knownIssues": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "blogPart": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdatePersonDto": {
        "required": [
          "coverImageLocked",
          "id",
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "coverImageLocked": {
            "type": "boolean"
          },
          "name": {
            "minLength": 1,
            "type": "string"
          },
          "aliases": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "aniListId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "malId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "hardcoverId": {
            "type": "string",
            "nullable": true
          },
          "asin": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateRatingDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "userRating": {
            "type": "number",
            "format": "float"
          }
        },
        "additionalProperties": false
      },
      "UpdateReadingListByChapterDto": {
        "type": "object",
        "properties": {
          "chapterId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "readingListId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "UpdateReadingListByMultipleDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "readingListId": {
            "type": "integer",
            "format": "int32"
          },
          "volumeIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "chapterIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateReadingListByMultipleSeriesDto": {
        "type": "object",
        "properties": {
          "readingListId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateReadingListBySeriesDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "readingListId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "UpdateReadingListByVolumeDto": {
        "type": "object",
        "properties": {
          "volumeId": {
            "type": "integer",
            "format": "int32"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "readingListId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "UpdateReadingListDto": {
        "required": [
          "readingListId"
        ],
        "type": "object",
        "properties": {
          "readingListId": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "promoted": {
            "type": "boolean"
          },
          "coverImageLocked": {
            "type": "boolean"
          },
          "startingMonth": {
            "type": "integer",
            "format": "int32"
          },
          "startingYear": {
            "type": "integer",
            "format": "int32"
          },
          "endingMonth": {
            "type": "integer",
            "format": "int32"
          },
          "endingYear": {
            "type": "integer",
            "format": "int32"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateReadingListPosition": {
        "required": [
          "readingListId",
          "readingListItemId",
          "toPosition"
        ],
        "type": "object",
        "properties": {
          "readingListId": {
            "type": "integer",
            "format": "int32"
          },
          "readingListItemId": {
            "type": "integer",
            "format": "int32"
          },
          "fromPosition": {
            "type": "integer",
            "format": "int32"
          },
          "toPosition": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "UpdateRelatedSeriesDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "adaptations": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "characters": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "contains": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "others": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "prequels": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "sequels": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "sideStories": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "spinOffs": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "alternativeSettings": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "alternativeVersions": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "doujinshis": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "editions": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "annuals": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "cameos": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateRemapRuleDto": {
        "type": "object",
        "properties": {
          "cblSeriesName": {
            "type": "string",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "volumeId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "chapterId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "cblVolume": {
            "type": "string",
            "nullable": true
          },
          "cblNumber": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateScrobbleProviderDto": {
        "required": [
          "provider"
        ],
        "type": "object",
        "properties": {
          "provider": {
            "$ref": "#/components/schemas/ScrobbleProvider"
          },
          "userName": {
            "type": "string",
            "nullable": true
          },
          "authenticationToken": {
            "type": "string",
            "nullable": true
          },
          "refreshToken": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateSeriesDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "localizedName": {
            "type": "string",
            "nullable": true
          },
          "sortName": {
            "type": "string",
            "nullable": true
          },
          "coverImageLocked": {
            "type": "boolean"
          },
          "nameLocked": {
            "type": "boolean"
          },
          "sortNameLocked": {
            "type": "boolean"
          },
          "localizedNameLocked": {
            "type": "boolean"
          },
          "aniListId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "malId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "hardcoverId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "metronId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "comicVineId": {
            "type": "string",
            "nullable": true
          },
          "mangaBakaId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "cbrId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateSeriesForTagDto": {
        "type": "object",
        "properties": {
          "tag": {
            "$ref": "#/components/schemas/AppUserCollectionDto"
          },
          "seriesIdsToRemove": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateSeriesMetadataDto": {
        "type": "object",
        "properties": {
          "seriesMetadata": {
            "$ref": "#/components/schemas/SeriesMetadataDto"
          }
        },
        "additionalProperties": false
      },
      "UpdateStreamPositionDto": {
        "type": "object",
        "properties": {
          "streamName": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "fromPosition": {
            "type": "integer",
            "format": "int32"
          },
          "toPosition": {
            "type": "integer",
            "format": "int32"
          },
          "positionIncludesInvisible": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "UpdateUserDto": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "integer",
            "format": "int32"
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "roles": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "libraries": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "ageRestriction": {
            "$ref": "#/components/schemas/AgeRestrictionDto"
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "identityProvider": {
            "$ref": "#/components/schemas/IdentityProvider"
          }
        },
        "additionalProperties": false
      },
      "UpdateUserReviewDto": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "body": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateUsernameRequestDto": {
        "required": [
          "username"
        ],
        "type": "object",
        "properties": {
          "username": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateVolumeDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "aniListId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "malId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "hardcoverId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "metronId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "comicVineId": {
            "type": "string",
            "nullable": true
          },
          "mangaBakaId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "cbrId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateWantToReadDto": {
        "type": "object",
        "properties": {
          "seriesIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UploadCoverFileDto": {
        "required": [
          "id"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "url": {
            "type": "string",
            "nullable": true
          },
          "fileName": {
            "type": "string",
            "nullable": true
          },
          "lockCover": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "UploadUrlDto": {
        "required": [
          "url"
        ],
        "type": "object",
        "properties": {
          "url": {
            "minLength": 1,
            "type": "string"
          },
          "isInternalUrl": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "UserDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "oidcId": {
            "type": "string",
            "nullable": true
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "roles": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "token": {
            "type": "string",
            "nullable": true
          },
          "refreshToken": {
            "type": "string",
            "nullable": true
          },
          "apiKey": {
            "type": "string",
            "nullable": true
          },
          "preferences": {
            "$ref": "#/components/schemas/UserPreferencesDto"
          },
          "ageRestriction": {
            "$ref": "#/components/schemas/AgeRestrictionDto"
          },
          "kavitaVersion": {
            "type": "string",
            "nullable": true
          },
          "identityProvider": {
            "$ref": "#/components/schemas/IdentityProvider"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "authKeys": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AuthKeyDto"
            },
            "nullable": true
          },
          "coverImage": {
            "type": "string",
            "nullable": true
          },
          "primaryColor": {
            "type": "string",
            "nullable": true
          },
          "secondaryColor": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UserParams": {
        "type": "object",
        "properties": {
          "pageNumber": {
            "type": "integer",
            "format": "int32"
          },
          "pageSize": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "UserPreferencesDto": {
        "required": [
          "blurUnreadSummaries",
          "bookReaderHighlightSlots",
          "collapseSeriesRelationships",
          "colorScapeEnabled",
          "customKeyBinds",
          "dataSaver",
          "locale",
          "noTransitions",
          "opdsPreferences",
          "promptForDownloadSize",
          "promptForRereadsAfter",
          "socialPreferences",
          "theme"
        ],
        "type": "object",
        "properties": {
          "theme": {
            "$ref": "#/components/schemas/SiteThemeDto"
          },
          "globalPageLayoutMode": {
            "$ref": "#/components/schemas/PageLayoutMode"
          },
          "blurUnreadSummaries": {
            "type": "boolean"
          },
          "promptForDownloadSize": {
            "type": "boolean"
          },
          "noTransitions": {
            "type": "boolean"
          },
          "collapseSeriesRelationships": {
            "type": "boolean"
          },
          "locale": {
            "minLength": 1,
            "type": "string"
          },
          "colorScapeEnabled": {
            "type": "boolean"
          },
          "dataSaver": {
            "type": "boolean"
          },
          "promptForRereadsAfter": {
            "type": "integer",
            "format": "int32"
          },
          "customKeyBinds": {
            "type": "object",
            "properties": {
              "NavigateToSettings": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "OpenSearch": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "NavigateToScrobbling": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "ToggleFullScreen": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "BookmarkPage": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "OpenHelp": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "GoTo": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "ToggleMenu": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "PageLeft": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "PageRight": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "Escape": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "PageUp": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "PageDown": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "OffsetDoublePage": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "NextChapter": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "PreviousChapter": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "FirstPage": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "LastPage": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              },
              "NavigateHome": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KeyBind"
                }
              }
            },
            "additionalProperties": false
          },
          "aniListScrobblingEnabled": {
            "type": "boolean"
          },
          "wantToReadSync": {
            "type": "boolean"
          },
          "bookReaderHighlightSlots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HighlightSlot"
            }
          },
          "socialPreferences": {
            "$ref": "#/components/schemas/AppUserSocialPreferences"
          },
          "opdsPreferences": {
            "$ref": "#/components/schemas/AppUserOpdsPreferences"
          }
        },
        "additionalProperties": false
      },
      "UserReadStatistics": {
        "type": "object",
        "properties": {
          "totalPagesRead": {
            "type": "integer",
            "format": "int64"
          },
          "totalWordsRead": {
            "type": "integer",
            "format": "int64"
          },
          "timeSpentReading": {
            "type": "integer",
            "format": "int64"
          },
          "lastActiveUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "avgHoursPerWeekSpentReading": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "UserReadingProfileDto": {
        "required": [
          "allowAutomaticWebtoonReaderDetection",
          "autoCloseMenu",
          "backgroundColor",
          "bookReaderDisableBookmarkIcon",
          "bookReaderFontFamily",
          "bookReaderFontSize",
          "bookReaderImmersiveMode",
          "bookReaderLayoutMode",
          "bookReaderLineSpacing",
          "bookReaderMargin",
          "bookReaderReadingDirection",
          "bookReaderTapToPaginate",
          "bookReaderThemeName",
          "bookReaderWritingStyle",
          "emulateBook",
          "layoutMode",
          "pageSplitOption",
          "pdfScrollMode",
          "pdfSpreadMode",
          "pdfTheme",
          "readerMode",
          "readingDirection",
          "scalingOption",
          "showScreenHints",
          "swipeToPaginate"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "userId": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "kind": {
            "$ref": "#/components/schemas/ReadingProfileKind"
          },
          "deviceIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "seriesIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "libraryIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "readingDirection": {
            "$ref": "#/components/schemas/ReadingDirection"
          },
          "scalingOption": {
            "$ref": "#/components/schemas/ScalingOption"
          },
          "pageSplitOption": {
            "$ref": "#/components/schemas/PageSplitOption"
          },
          "readerMode": {
            "$ref": "#/components/schemas/ReaderMode"
          },
          "autoCloseMenu": {
            "type": "boolean"
          },
          "showScreenHints": {
            "type": "boolean"
          },
          "emulateBook": {
            "type": "boolean"
          },
          "layoutMode": {
            "$ref": "#/components/schemas/LayoutMode"
          },
          "backgroundColor": {
            "minLength": 1,
            "type": "string"
          },
          "swipeToPaginate": {
            "type": "boolean"
          },
          "allowAutomaticWebtoonReaderDetection": {
            "type": "boolean"
          },
          "widthOverride": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "disableWidthOverride": {
            "$ref": "#/components/schemas/BreakPoint"
          },
          "bookReaderMargin": {
            "type": "integer",
            "format": "int32"
          },
          "bookReaderLineSpacing": {
            "type": "integer",
            "format": "int32"
          },
          "bookReaderFontSize": {
            "type": "integer",
            "format": "int32"
          },
          "bookReaderFontFamily": {
            "minLength": 1,
            "type": "string"
          },
          "bookReaderTapToPaginate": {
            "type": "boolean"
          },
          "bookReaderReadingDirection": {
            "$ref": "#/components/schemas/ReadingDirection"
          },
          "bookReaderWritingStyle": {
            "$ref": "#/components/schemas/WritingStyle"
          },
          "bookReaderThemeName": {
            "minLength": 1,
            "type": "string"
          },
          "bookReaderLayoutMode": {
            "$ref": "#/components/schemas/BookPageLayoutMode"
          },
          "bookReaderImmersiveMode": {
            "type": "boolean"
          },
          "bookReaderDisableBookmarkIcon": {
            "type": "boolean"
          },
          "pdfTheme": {
            "$ref": "#/components/schemas/PdfTheme"
          },
          "pdfScrollMode": {
            "$ref": "#/components/schemas/PdfScrollMode"
          },
          "pdfSpreadMode": {
            "$ref": "#/components/schemas/PdfSpreadMode"
          }
        },
        "additionalProperties": false
      },
      "UserReviewDto": {
        "type": "object",
        "properties": {
          "tagline": {
            "type": "string",
            "nullable": true
          },
          "body": {
            "type": "string",
            "nullable": true
          },
          "bodyJustText": {
            "type": "string",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "userId": {
            "type": "integer",
            "format": "int32"
          },
          "totalVotes": {
            "type": "integer",
            "format": "int32"
          },
          "rating": {
            "type": "number",
            "format": "float"
          },
          "rawBody": {
            "type": "string",
            "nullable": true
          },
          "score": {
            "type": "integer",
            "format": "int32"
          },
          "siteUrl": {
            "type": "string",
            "nullable": true
          },
          "isExternal": {
            "type": "boolean"
          },
          "provider": {
            "$ref": "#/components/schemas/ScrobbleProvider"
          },
          "authority": {
            "$ref": "#/components/schemas/RatingAuthority"
          }
        },
        "additionalProperties": false
      },
      "UserReviewExtendedDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "body": {
            "type": "string",
            "nullable": true
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "chapterId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "libraryId": {
            "type": "integer",
            "format": "int32"
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "rating": {
            "type": "number",
            "format": "float"
          },
          "series": {
            "$ref": "#/components/schemas/SeriesDto"
          },
          "chapter": {
            "$ref": "#/components/schemas/ChapterDto"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "writers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UserTokenInfoDto": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "integer",
            "format": "int32"
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "tokens": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TokenValidityInfoDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "VolumeDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "minNumber": {
            "type": "number",
            "format": "float"
          },
          "maxNumber": {
            "type": "number",
            "format": "float"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "number": {
            "type": "integer",
            "format": "int32",
            "deprecated": true
          },
          "pages": {
            "type": "integer",
            "format": "int32"
          },
          "pagesRead": {
            "type": "integer",
            "format": "int32"
          },
          "lastModifiedUtc": {
            "type": "string",
            "format": "date-time"
          },
          "createdUtc": {
            "type": "string",
            "format": "date-time"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "lastModified": {
            "type": "string",
            "format": "date-time"
          },
          "seriesId": {
            "type": "integer",
            "format": "int32"
          },
          "chapters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChapterDto"
            },
            "nullable": true
          },
          "minHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "maxHoursToRead": {
            "type": "integer",
            "format": "int32"
          },
          "avgHoursToRead": {
            "type": "number",
            "format": "float"
          },
          "wordCount": {
            "type": "integer",
            "format": "int64"
          },
          "coverImage": {
            "type": "string",
            "nullable": true
          },
          "primaryColor": {
            "type": "string",
            "nullable": true
          },
          "secondaryColor": {
            "type": "string",
            "nullable": true
          },
          "aniListId": {
            "type": "integer",
            "format": "int32"
          },
          "malId": {
            "type": "integer",
            "format": "int64"
          },
          "hardcoverId": {
            "type": "integer",
            "format": "int32"
          },
          "metronId": {
            "type": "integer",
            "format": "int64"
          },
          "comicVineId": {
            "type": "string",
            "nullable": true
          },
          "mangaBakaId": {
            "type": "integer",
            "format": "int64"
          },
          "cbrId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "WritingStyle": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "description": "Members:\n- `0` — Horizontal\n- `1` — Vertical",
        "format": "int32",
        "x-enum-varnames": [
          "Horizontal",
          "Vertical"
        ],
        "x-enum-descriptions": [
          "Horizontal",
          "Vertical"
        ]
      },
      "YearMonthGroupingDto": {
        "type": "object",
        "properties": {
          "year": {
            "type": "integer",
            "format": "int32"
          },
          "month": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "YearMonthGroupingDtoStatCount": {
        "type": "object",
        "properties": {
          "value": {
            "$ref": "#/components/schemas/YearMonthGroupingDto"
          },
          "count": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      }
    },
    "securitySchemes": {
      "AuthKey": {
        "type": "apiKey",
        "description": "Auth Key authentication. Enter your Auth key from your user settings",
        "name": "x-api-key",
        "in": "header"
      }
    }
  },
  "security": [
    {
      "AuthKey": []
    }
  ],
  "tags": [
    {
      "name": "Account",
      "description": "All Account matters"
    },
    {
      "name": "Activity"
    },
    {
      "name": "Admin"
    },
    {
      "name": "Annotation"
    },
    {
      "name": "Book"
    },
    {
      "name": "Cbl",
      "description": "Responsible for the CBL import flow"
    },
    {
      "name": "Chapter"
    },
    {
      "name": "Collection",
      "description": "APIs for Collections"
    },
    {
      "name": "ColorScape"
    },
    {
      "name": "Device",
      "description": "Responsible for interacting and creating Devices"
    },
    {
      "name": "Download",
      "description": "All APIs related to downloading entities from the system. Requires Download Role or Admin Role."
    },
    {
      "name": "Email"
    },
    {
      "name": "Filter"
    },
    {
      "name": "Font"
    },
    {
      "name": "Health"
    },
    {
      "name": "Image",
      "description": "Responsible for servicing up images stored in Kavita for entities"
    },
    {
      "name": "KavitaPlusAudit"
    },
    {
      "name": "Koreader",
      "description": "The endpoint to interface with Koreader's Progress Sync plugin."
    },
    {
      "name": "Library"
    },
    {
      "name": "License"
    },
    {
      "name": "Locale"
    },
    {
      "name": "Manage",
      "description": "All things centered around Managing the Kavita instance, that isn't aligned with an entity"
    },
    {
      "name": "Metadata"
    },
    {
      "name": "OAuth"
    },
    {
      "name": "Oidc"
    },
    {
      "name": "Opds"
    },
    {
      "name": "Panels",
      "description": "For the Panels app explicitly"
    },
    {
      "name": "Person"
    },
    {
      "name": "Plugin"
    },
    {
      "name": "Rating",
      "description": "Responsible for providing external ratings for Series"
    },
    {
      "name": "Reader",
      "description": "For all things regarding reading, mainly focusing on non-Book related entities"
    },
    {
      "name": "ReadingList"
    },
    {
      "name": "ReadingProfile"
    },
    {
      "name": "Review"
    },
    {
      "name": "Scrobbling"
    },
    {
      "name": "Search",
      "description": "Responsible for the Search interface from the UI"
    },
    {
      "name": "Series"
    },
    {
      "name": "Server"
    },
    {
      "name": "Settings"
    },
    {
      "name": "Stats"
    },
    {
      "name": "Stream",
      "description": "Responsible for anything that deals with Streams (SmartFilters, ExternalSource, DashboardStream, SideNavStream)"
    },
    {
      "name": "Tachiyomi",
      "description": "All APIs are for Tachiyomi extension and app. They have hacks for our implementation and should not be used for any\nother purposes."
    },
    {
      "name": "Theme"
    },
    {
      "name": "Upload"
    },
    {
      "name": "Users"
    },
    {
      "name": "Volume"
    },
    {
      "name": "WantToRead",
      "description": "Responsible for all things Want To Read"
    }
  ]
}