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