mangadex 0.1.2

Unofficial asynchronous mangadex API wrapper for rust
Documentation
openapi: 3.0.3
tags:
  - name: Manga
  - name: Cover
  - name: Author
  - name: Search
  - name: Auth
  - name: ScanlationGroup
  - name: Feed
  - name: CustomList
  - name: Captcha
  - name: AtHome
  - name: Legacy
  - name: Infrastructure
info:
  title: MangaDex API
  version: 5.1.4
  contact:
    name: MangaDex staff team
    email: mangadexstaff@gmail.com
  description: |-
    MangaDex is an ad-free manga reader offering high-quality images!

    This document details our API as it is right now. It is in no way a promise to never change it, although we will endeavour to publicly notify any major change.

    # Authentication

    You can login with the `/auth/login` endpoint. On success, it will return a JWT that remains valid for 15 minutes along with a session token that allows refreshing without re-authenticating for 1 month.

    # Rate limits

    The API enforces rate-limits to protect our servers against malicious and/or mistaken use. The API keeps track of the requests on an IP-by-IP basis.
    Hence, if you're on a VPN, proxy or a shared network in general, the requests of other users on this network might affect you.

    At first, a **global limit of 5 requests per second per IP address** is in effect.

    > This limit is enforced across multiple load-balancers, and thus
    is not an exact value but rather a lower-bound that we guarantee. The exact value will be somewhere in the range `[5, 5*n]` (with `n` being the number of
    load-balancers currently active). The exact value within this range will depend on the current traffic patterns we are experiencing.

    On top of this, **some endpoints are further restricted** as follows:

    | Endpoint                           | Requests per time period    | Time period in minutes |
    |------------------------------------|--------------------------   |------------------------|
    | `POST   /account/create`           | 1                           | 60                     |
    | `GET    /account/activate/{code}`  | 30                          | 60                     |
    | `POST   /account/activate/resend`  | 5                           | 60                     |
    | `POST   /account/recover`          | 5                           | 60                     |
    | `POST   /account/recover/{code}`   | 5                           | 60                     |
    | `POST   /auth/login`               | 30                          | 60                     |
    | `POST   /auth/refresh`             | 30                          | 60                     |
    | `POST   /author`                   | 10                          | 60                     |
    | `PUT    /author`                   | 10                          | 1                      |
    | `DELETE /author/{id}`              | 10                          | 10                     |
    | `POST   /captcha/solve`            | 10                          | 10                     |
    | `POST   /chapter/{id}/read`        | 300                         | 10                     |
    | `PUT    /chapter/{id}`             | 10                          | 1                      |
    | `DELETE /chapter/{id}`             | 10                          | 1                      |
    | `POST   /manga`                    | 10                          | 60                     |
    | `PUT    /manga/{id}`               | 10                          | 60                     |
    | `DELETE /manga/{id}`               | 10                          | 10                     |
    | `POST   /cover`                    | 10                          | 1                      |
    | `PUT    /cover/{id}`               | 10                          | 1                      |
    | `DELETE /cover/{id}`               | 10                          | 10                     |
    | `POST   /group`                    | 10                          | 60                     |
    | `PUT    /group/{id}`               | 10                          | 1                      |
    | `DELETE /group/{id}`               | 10                          | 10                     |
    | `GET    /at-home/server/{id}`      | 60                          | 1                      |

    Calling these endpoints will further provide details via the following headers about your remaining quotas:

    | Header                    | Description                                                                 |
    |---------------------------|-----------------------------------------------------------------------------|
    | `X-RateLimit-Limit`       | Maximal number of requests this endpoint allows per its time period         |
    | `X-RateLimit-Remaining`   | Remaining number of requests within your quota for the current time period  |
    | `X-RateLimit-Retry-After` | Timestamp of the end of the current time period, as UNIX timestamp          |

    # Result Limit

    Most of our listing endpoints will return a maximum number of total results that is currently capped at 10.000 items. Beyond that you will not receive any more items no matter how far you paginate and the results will become empty instead. This is for performance reasons and a limitation we will not lift.

    Note that the limit is applied to a search query and list endpoints with or without any filters are search queries.
    If you need to retrieve more items, use filters to narrow down your search.

    # Reference Expansion

    Reference Expansion is a feature of certain endpoints where relationships of a resource are expanded with their attributes, which reduces the amount of requests that need to be sent to the API to retrieve a complete set of data.

    It works by appending a list of includes to the query with the type names from the relationships. If an endpoint supports this feature is indicated by the presence of the optional `includes` parameter.

    ## Example

    To fetch a specific manga with `author`, `artist` and `cover_art` expanded, you can send the following request: `GET /manga/f9c33607-9180-4ba6-b85c-e4b5faee7192?includes[]=author&includes[]=artist&includes[]=cover_art`. You will now find the objects attributes inside the returned relationships array.

    ## Note

    Your current user needs `*.view` permission on each type of reference you want to expand. Guests have most of these permissions and for logged-in user accounts you can check `GET /auth/check` to list all permissions you have been granted. For example, to be able to expand `cover_art`, you need to have been granted the `cover.view` permission, for `author` and `artist` types you need the `author.view` permission and so on.
    If a reference can't be expanded, the request will still succeed and no error indication will be visible.

    # Captchas

    Some endpoints may require captchas to proceed, in order to slow down automated malicious traffic.
    Legitimate users might also be affected, based on the frequency of write requests or due certain endpoints being particularly sensitive to malicious use, such as user signup.

    Once an endpoint decides that a captcha needs to be solved, a 403 Forbidden response will be returned, with the error code `captcha_required_exception`.
    The sitekey needed for recaptcha to function is provided in both the `X-Captcha-Sitekey` header field, as well as in the error context, specified as `siteKey` parameter.

    The captcha result of the client can either be passed into the repeated original request with the `X-Captcha-Result` header or alternatively to the `POST /captcha/solve` endpoint.
    The time a solved captcha is remembered varies across different endpoints and can also be influenced by individual client behavior.

    Authentication is not required for the `POST /captcha/solve` endpoint, captchas are tracked both by client ip and logged in user id.
    If you are logged in, you want to send the session token along, so you validate the captcha for your client ip and user id at the same time, but it is not required.

    # Reading a chapter using the API

    ## Retrieving pages from the MangaDex@Home network

    A valid [MangaDex@Home network](https://mangadex.network) page URL is in the following format: `{server-specific base url}/{temporary access token}/{quality mode}/{chapter hash}/{filename}`

    There are currently 2 quality modes:
    - `data`: Original upload quality
    - `data-saver`: Compressed quality

    Upon fetching a chapter from the API, you will find 4 fields necessary to compute MangaDex@Home page URLs:

    | Field                        | Type     | Description                       |
    |------------------------------|----------|-----------------------------------|
    | `.data.id`                   | `string` | API Chapter ID                    |
    | `.data.attributes.hash`      | `string` | MangaDex@Home Chapter Hash        |
    | `.data.attributes.data`      | `array`  | data quality mode filenames       |
    | `.data.attributes.dataSaver` | `array`  | data-saver quality mode filenames |

    Example
    ```json
    GET /chapter/{id}

    {
      ...,
      "data": {
        "id": "e46e5118-80ce-4382-a506-f61a24865166",
        ...,
        "attributes": {
          ...,
          "hash": "e199c7d73af7a58e8a4d0263f03db660",
          "data": [
            "x1-b765e86d5ecbc932cf3f517a8604f6ac6d8a7f379b0277a117dc7c09c53d041e.png",
            ...
          ],
          "dataSaver": [
            "x1-ab2b7c8f30c843aa3a53c29bc8c0e204fba4ab3e75985d761921eb6a52ff6159.jpg",
            ...
          ]
        }
      }
    }
    ```

    From this point you miss only the base URL to an assigned MangaDex@Home server for your client and chapter. This is retrieved via a `GET` request
    to `/at-home/server/{ chapter .data.id }`.

    Example:
    ```json
    GET /at-home/server/e46e5118-80ce-4382-a506-f61a24865166

    {
      "baseUrl": "https://abcdefg.hijklmn.mangadex.network:12345/some-token"
    }
    ```

    The full URL is the constructed as follows
    ```
    { server .baseUrl }/{ quality mode }/{ chapter .data.attributes.hash }/{ chapter .data.attributes.{ quality mode }.[*] }

    Examples

    data quality: https://abcdefg.hijklmn.mangadex.network:12345/some-token/data/e199c7d73af7a58e8a4d0263f03db660/x1-b765e86d5ecbc932cf3f517a8604f6ac6d8a7f379b0277a117dc7c09c53d041e.png

          base url: https://abcdefg.hijklmn.mangadex.network:12345/some-token
      quality mode: data
      chapter hash: e199c7d73af7a58e8a4d0263f03db660
          filename: x1-b765e86d5ecbc932cf3f517a8604f6ac6d8a7f379b0277a117dc7c09c53d041e.png


    data-saver quality: https://abcdefg.hijklmn.mangadex.network:12345/some-token/data-saver/e199c7d73af7a58e8a4d0263f03db660/x1-ab2b7c8f30c843aa3a53c29bc8c0e204fba4ab3e75985d761921eb6a52ff6159.jpg

          base url: https://abcdefg.hijklmn.mangadex.network:12345/some-token
      quality mode: data-saver
      chapter hash: e199c7d73af7a58e8a4d0263f03db660
          filename: x1-ab2b7c8f30c843aa3a53c29bc8c0e204fba4ab3e75985d761921eb6a52ff6159.jpg
    ```

    If the server you have been assigned fails to serve images, you are allowed to call the `/at-home/server/{ chapter id }` endpoint again to get another server.

    Whether successful or not, **please do report the result you encountered as detailed below**. This is so we can pull the faulty server out of the network.

    ## Report

    In order to keep track of the health of the servers in the network and to improve the quality of service and reliability, we ask that you call the
    MangaDex@Home report endpoint after each image you retrieve, whether successfully or not.

    It is a `POST` request against `https://api.mangadex.network/report` and expects the following payload with our example above:

    | Field                       | Type       | Description                                                                         |
    |-----------------------------|------------|-------------------------------------------------------------------------------------|
    | `url`                       | `string`   | The full URL of the image                                                           |
    | `success`                   | `boolean`  | Whether the image was successfully retrieved                                        |
    | `cached `                   | `boolean`  | `true` iff the server returned an `X-Cache` header with a value starting with `HIT` |
    | `bytes`                     | `number`   | The size in bytes of the retrieved image                                            |
    | `duration`                  | `number`   | The time in miliseconds that the complete retrieval (not TTFB) of this image took   |

    Examples herafter.

    **Success:**
    ```json
    POST https://api.mangadex.network/report
    Content-Type: application/json

    {
      "url": "https://abcdefg.hijklmn.mangadex.network:12345/some-token/data/e199c7d73af7a58e8a4d0263f03db660/x1-b765e86d5ecbc932cf3f517a8604f6ac6d8a7f379b0277a117dc7c09c53d041e.png",
      "success": true,
      "bytes": 727040,
      "duration": 235,
      "cached": true
    }
    ```

    **Failure:**
    ```json
    POST https://api.mangadex.network/report
    Content-Type: application/json

    {
     "url": "https://abcdefg.hijklmn.mangadex.network:12345/some-token/data/e199c7d73af7a58e8a4d0263f03db660/x1-b765e86d5ecbc932cf3f517a8604f6ac6d8a7f379b0277a117dc7c09c53d041e.png",
     "success": false,
     "bytes": 25,
     "duration": 235,
     "cached": false
    }
    ```

    While not strictly necessary, this helps us monitor the network's healthiness, and we appreciate your cooperation towards this goal. If no one reports
    successes and failures, we have no way to know that a given server is slow/broken, which eventually results in broken image retrieval for everyone.

    # Retrieving Covers from the API

    ## Construct Cover URLs

    ### Source (original/best quality)

    `https://uploads.mangadex.org/covers/{ manga.id }/{ cover.filename }`<br/>
    The extension can be png, jpeg or gif.

    Example: `https://uploads.mangadex.org/covers/8f3e1818-a015-491d-bd81-3addc4d7d56a/4113e972-d228-4172-a885-cb30baffff97.jpg`

    ### <=512px wide thumbnail

    `https://uploads.mangadex.org/covers/{ manga.id }/{ cover.filename }.512.jpg`<br/>
    The extension is always jpg.

    Example: `https://uploads.mangadex.org/covers/8f3e1818-a015-491d-bd81-3addc4d7d56a/4113e972-d228-4172-a885-cb30baffff97.jpg.512.jpg`

    ### <=256px wide thumbnail

    `https://uploads.mangadex.org/covers/{ manga.id }/{ cover.filename }.256.jpg`<br/>
    The extension is always jpg.

    Example: `https://uploads.mangadex.org/covers/8f3e1818-a015-491d-bd81-3addc4d7d56a/4113e972-d228-4172-a885-cb30baffff97.jpg.256.jpg`

    ## ℹ️ Where to find Cover filename ?

    Look at the [Get cover operation](#operation/get-cover) endpoint to get Cover information.
    Also, if you get a Manga resource, you'll have, if available a `covert_art` relationship which is the main cover id.

    # Static data

    ## Manga publication demographic

    | Value            | Description               |
    |------------------|---------------------------|
    | shounen          | Manga is a Shounen        |
    | shoujo           | Manga is a Shoujo         |
    | josei            | Manga is a Josei          |
    | seinen           | Manga is a Seinen         |

    ## Manga status

    | Value            | Description               |
    |------------------|---------------------------|
    | ongoing          | Manga is still going on   |
    | completed        | Manga is completed        |
    | hiatus           | Manga is paused           |
    | cancelled        | Manga has been cancelled  |

    ## Manga reading status

    | Value            |
    |------------------|
    | reading          |
    | on_hold          |
    | plan\_to\_read   |
    | dropped          |
    | re\_reading      |
    | completed        |

    ## Manga content rating

    | Value            | Description               |
    |------------------|---------------------------|
    | safe             | Safe content              |
    | suggestive       | Suggestive content        |
    | erotica          | Erotica content           |
    | pornographic     | Pornographic content      |

    ## CustomList visibility

    | Value            | Description               |
    |------------------|---------------------------|
    | public           | CustomList is public      |
    | private          | CustomList is private     |

    ## Relationship types

    | Value            | Description                    |
    |------------------|--------------------------------|
    | manga            | Manga resource                 |
    | chapter          | Chapter resource               |
    | cover_art        | A Cover Art for a manga `*`    |
    | author           | Author resource                |
    | artist           | Author resource (drawers only) |
    | scanlation_group | ScanlationGroup resource       |
    | tag              | Tag resource                   |
    | user             | User resource                  |
    | custom_list      | CustomList resource            |

    `*` Note, that on manga resources you get only one cover_art resource relation marking the primary cover if there are more than one.
    By default this will be the latest volume's cover art. If you like to see all the covers for a given manga, use the cover search endpoint for your mangaId and select the one you wish to display.

    ## Manga links data

    In Manga attributes you have the `links` field that is a JSON object with some strange keys, here is how to decode this object:

    | Key   | Related site  | URL                                                                                           | URL details                                                    |
    |-------|---------------|-----------------------------------------------------------------------------------------------|----------------------------------------------------------------|
    | al    | anilist       | https://anilist.co/manga/`{id}`                                                               | Stored as id                                                   |
    | ap    | animeplanet   | https://www.anime-planet.com/manga/`{slug}`                                                   | Stored as slug                                                 |
    | bw    | bookwalker.jp | https://bookwalker.jp/`{slug}`                                                                | Stored has "series/{id}"                                       |
    | mu    | mangaupdates  | https://www.mangaupdates.com/series.html?id=`{id}`                                            | Stored has id                                                  |
    | nu    | novelupdates  | https://www.novelupdates.com/series/`{slug}`                                                  | Stored has slug                                                |
    | kt    | kitsu.io      | https://kitsu.io/api/edge/manga/`{id}` or https://kitsu.io/api/edge/manga?filter[slug]={slug} | If integer, use id version of the URL, otherwise use slug one  |
    | amz   | amazon        | N/A                                                                                           | Stored as full URL                                             |
    | ebj   | ebookjapan    | N/A                                                                                           | Stored as full URL                                             |
    | mal   | myanimelist   | https://myanimelist.net/manga/{id}                                                            | Store as id                                                    |
    | raw   | N/A           | N/A                                                                                           | Stored as full URL, untranslated stuff URL (original language) |
    | engtl | N/A           | N/A                                                                                           | Stored as full URL, official english licenced URL              |
servers:
  - url: 'https://api.mangadex.org'
    description: MangaDex Api
paths:
  /ping:
    get:
      summary: Ping the server
      tags:
        - Infrastructure
      security: []
      responses:
        '200':
          description: Pong
          content:
            application/json:
              schema:
                type: string
                default: pong
  /manga:
    get:
      summary: Manga list
      tags:
        - Manga
        - Search
      responses:
        '200':
          description: Manga list
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MangaList'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      operationId: get-search-manga
      description: Search a list of Manga.
      parameters:
        - schema:
            type: integer
            default: 10
            minimum: 1
            maximum: 100
          in: query
          name: limit
        - schema:
            type: integer
            minimum: 0
          in: query
          name: offset
        - schema:
            type: string
          in: query
          name: title
        - schema:
            type: array
            items:
              type: string
              format: uuid
          in: query
          name: authors
        - schema:
            type: array
            items:
              type: string
              format: uuid
          in: query
          name: artists
        - schema:
            type: integer
          in: query
          name: year
          description: Year of release
        - schema:
            type: array
            items:
              type: string
              format: uuid
          in: query
          name: includedTags
        - schema:
            type: string
            enum:
              - AND
              - OR
            default: AND
          in: query
          name: includedTagsMode
        - schema:
            type: array
            items:
              type: string
              format: uuid
          in: query
          name: excludedTags
        - schema:
            type: string
            enum:
              - AND
              - OR
            default: OR
          in: query
          name: excludedTagsMode
        - schema:
            type: array
            items:
              type: string
              enum:
                - ongoing
                - completed
                - hiatus
                - cancelled
          in: query
          name: status
        - schema:
            type: array
            items:
              type: string
              pattern: ^[a-zA-Z\-]{2,5}$
          in: query
          name: originalLanguage
        - schema:
            type: array
            items:
              type: string
              enum:
                - shounen
                - shoujo
                - josei
                - seinen
                - none
          in: query
          name: publicationDemographic
        - schema:
            type: array
            items:
              type: string
              format: uuid
          in: query
          name: ids
          description: Manga ids (limited to 100 per request)
        - schema:
            type: array
            default: [none, safe, suggestive, erotica]
            items:
              type: string
              enum:
                - none
                - safe
                - suggestive
                - erotica
                - pornographic
          in: query
          name: contentRating
        - schema:
            type: string
            description: "DateTime string with following format: YYYY-MM-DDTHH:MM:SS"
            pattern: ^\d{4}-[0-1]\d-([0-2]\d|3[0-1])T([0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$
          in: query
          name: createdAtSince
        - schema:
            type: string
            description: "DateTime string with following format: YYYY-MM-DDTHH:MM:SS"
            pattern: ^\d{4}-[0-1]\d-([0-2]\d|3[0-1])T([0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$
          in: query
          name: updatedAtSince
        - schema:
            type: object
            properties:
              createdAt:
                type: string
                enum:
                  - asc
                  - desc
              updatedAt:
                type: string
                enum:
                  - asc
                  - desc
          in: query
          name: order
        - schema:
            type: array
            items:
              type: string
          in: query
          name: includes
      security: []
    post:
      summary: Create Manga
      operationId: post-manga
      responses:
        '200':
          description: Manga Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MangaResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MangaCreate'
        description: The size of the body is limited to 16KB.
      description: Create a new Manga.
      tags:
        - Manga
  '/manga/{id}/aggregate':
    parameters:
      - schema:
          type: string
          format: uuid
        name: id
        in: path
        required: true
        description: Manga ID
    get:
      summary: Get Manga volumes & chapters
      security: []
      tags:
        - Manga
      parameters:
        - schema:
            type: array
            items:
              type: string
              pattern: '^[a-zA-Z\-]{2,5}$'
          in: query
          name: translatedLanguage
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  result:
                    type: string
                    default: ok
                  volumes:
                    type: object
                    additionalProperties:
                      type: object
                      properties:
                        volume:
                          type: string
                        count:
                          type: integer
                        chapters:
                          type: object
                          additionalProperties:
                            type: object
                            properties:
                              chapter:
                                type: string
                              count:
                                type: integer
  '/manga/{id}':
    parameters:
      - schema:
          type: string
          format: uuid
        name: id
        in: path
        required: true
        description: Manga ID
    get:
      summary: View Manga
      tags:
        - Manga
      parameters:
        - schema:
            type: array
            items:
              type: string
          in: query
          name: includes
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MangaResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Manga no content
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      operationId: get-manga-id
      description: View Manga.
      security: []
    put:
      summary: Update Manga
      operationId: put-manga-id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MangaResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MangaEdit'
        description: The size of the body is limited to 16KB.
      tags:
        - Manga
    delete:
      summary: Delete Manga
      operationId: delete-manga-id
      responses:
        '200':
          description: Manga has been deleted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Response'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - Manga
  /auth/login:
    post:
      summary: Login
      tags:
        - Auth
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LoginResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
      operationId: post-auth-login
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Login'
        description: The size of the body is limited to 2KB.
      security: []
  /auth/check:
    get:
      summary: Check token
      tags:
        - Auth
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CheckResponse'
      operationId: get-auth-check
  /auth/logout:
    post:
      summary: Logout
      tags:
        - Auth
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LogoutResponse'
        '503':
          description: Service Unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      operationId: post-auth-logout
  /auth/refresh:
    post:
      summary: Refresh token
      tags:
        - Auth
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefreshResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      operationId: post-auth-refresh
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RefreshToken'
        description: The size of the body is limited to 2KB.
      security: []
  /account/create:
    post:
      summary: Create Account
      operationId: post-account-create
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateAccount'
        description: The size of the body is limited to 4KB.
      tags:
        - Account
  '/account/activate/{code}':
    parameters:
      - schema:
          type: string
          pattern: '[0-9a-fA-F-]+'
        name: code
        in: path
        required: true
    get:
      summary: Activate account
      tags:
        - Account
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccountActivateResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      operationId: get-account-activate-code
      parameters: []
      security: []
  /group:
    get:
      summary: Scanlation Group list
      tags:
        - ScanlationGroup
        - Search
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScanlationGroupList'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      operationId: get-search-group
      parameters:
        - schema:
            type: integer
            default: 10
            minimum: 1
            maximum: 100
          in: query
          name: limit
        - schema:
            type: integer
            minimum: 0
          in: query
          name: offset
        - schema:
            type: array
            items:
              type: string
              format: uuid
          in: query
          name: ids
          description: ScanlationGroup ids (limited to 100 per request)
        - schema:
            type: string
          in: query
          name: name
        - schema:
            type: array
            items:
              type: string
          in: query
          name: includes
      security: []
    post:
      summary: Create Scanlation Group
      operationId: post-group
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScanlationGroupResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - ScanlationGroup
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateScanlationGroup'
        description: The size of the body is limited to 8KB.
  '/group/{id}':
    parameters:
      - schema:
          type: string
          format: uuid
        name: id
        in: path
        required: true
        description: Scanlation Group ID
    get:
      summary: View Scanlation Group
      tags:
        - ScanlationGroup
      parameters:
        - schema:
            type: array
            items:
              type: string
          in: query
          name: includes
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScanlationGroupResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: ScanlationGroup not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      operationId: get-group-id
      security: []
    put:
      summary: Update Scanlation Group
      operationId: put-group-id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScanlationGroupResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - ScanlationGroup
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScanlationGroupEdit'
        description: The size of the body is limited to 8KB.
    delete:
      summary: Delete Scanlation Group
      operationId: delete-group-id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Response'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - ScanlationGroup
  '/group/{id}/follow':
    parameters:
      - schema:
          type: string
          format: uuid
        name: id
        in: path
        required: true
    post:
      summary: Follow Scanlation Group
      operationId: post-group-id-follow
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Response'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - ScanlationGroup
    delete:
      summary: Unfollow Scanlation Group
      operationId: delete-group-id-follow
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Response'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - ScanlationGroup
  /list:
    post:
      summary: Create CustomList
      operationId: post-list
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomListResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - CustomList
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CustomListCreate'
        description: The size of the body is limited to 8KB.
  '/list/{id}':
    parameters:
      - schema:
          type: string
          format: uuid
        name: id
        in: path
        required: true
        description: CustomList ID
    get:
      summary: Get CustomList
      tags:
        - CustomList
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomListResponse'
        '404':
          description: CustomList not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      operationId: get-list-id
      security: []
    put:
      summary: Update CustomList
      operationId: put-list-id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomListResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - CustomList
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CustomListEdit'
      description: The size of the body is limited to 8KB.
    delete:
      summary: Delete CustomList
      operationId: delete-list-id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Response'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - CustomList
  '/manga/{id}/list/{listId}':
    parameters:
      - schema:
          type: string
          format: uuid
        name: id
        in: path
        required: true
        description: Manga ID
      - schema:
          type: string
          format: uuid
        name: listId
        in: path
        required: true
        description: CustomList ID
    post:
      summary: Add Manga in CustomList
      operationId: post-manga-id-list-listId
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Response'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - Manga
        - CustomList
    delete:
      summary: Remove Manga in CustomList
      operationId: delete-manga-id-list-listId
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Response'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - CustomList
        - Manga
  /user/list:
    get:
      summary: Get logged User CustomList list
      tags:
        - CustomList
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomListList'
      operationId: get-user-list
      parameters:
        - schema:
            type: integer
            default: 10
            minimum: 1
            maximum: 100
          in: query
          name: limit
        - schema:
            type: integer
            minimum: 0
          in: query
          name: offset
      description: This will list public and private CustomList
  '/user/{id}/list':
    parameters:
      - schema:
          type: string
          format: uuid
        name: id
        in: path
        required: true
        description: User ID
    get:
      summary: Get User's CustomList list
      tags:
        - CustomList
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomListList'
      operationId: get-user-id-list
      parameters:
        - schema:
            type: integer
            default: 10
            minimum: 1
            maximum: 100
          in: query
          name: limit
        - schema:
            type: integer
            minimum: 0
          in: query
          name: offset
      description: This will list only public CustomList
  '/user':
    get:
      summary: User list
      tags:
        - User
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserList'
      operationId: get-user
      parameters:
        - schema:
            type: integer
            default: 10
            minimum: 1
            maximum: 100
          in: query
          name: limit
        - schema:
            type: integer
            minimum: 0
          in: query
          name: offset
        - schema:
            type: array
            items:
              type: string
              format: uuid
          in: query
          name: ids
          description: User ids (limited to 100 per request)
        - schema:
            type: string
          in: query
          name: username
        - schema:
            type: object
            properties:
              username:
                type: string
                enum: ['asc', 'desc']
          in: query
          name: order
  '/user/{id}':
    parameters:
      - schema:
          type: string
          format: uuid
        name: id
        in: path
        required: true
        description: User ID
    get:
      summary: Get User
      tags:
        - User
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserResponse'
      operationId: get-user-id
      security: []
  /user/password:
    post:
      summary: Update User password
      tags:
        - User
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Response'
      operationId: post-user-password
      requestBody:
        content:
          application/json:
            schema:
              description: ''
              type: object
              properties:
                oldPassword:
                  type: string
                  minLength: 8
                  maxLength: 1024
                newPassword:
                  type: string
                  minLength: 8
                  maxLength: 1024
              required:
                - oldPassword
                - newPassword
  /user/email:
    post:
      summary: Update User email
      tags:
        - User
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Response'
      operationId: post-user-email
      requestBody:
        content:
          application/json:
            schema:
              description: ''
              type: object
              properties:
                email:
                  type: string
                  format: email
              required:
                - email
  /chapter:
    parameters: []
    get:
      summary: Chapter list
      description: Chapter list. If you want the Chapters of a given Manga, please check the feed endpoints.
      operationId: get-chapter
      responses:
        '200':
          description: Chapter list
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChapterList'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      parameters:
        - schema:
            type: integer
            default: 10
            minimum: 1
            maximum: 100
          in: query
          name: limit
        - schema:
            type: integer
            minimum: 0
          in: query
          name: offset
        - schema:
            type: array
            items:
              type: string
              format: uuid
          in: query
          name: ids
          description: Chapter ids (limited to 100 per request)
        - schema:
            type: string
          in: query
          name: title
        - schema:
            type: array
            items:
              type: string
              format: uuid
          in: query
          name: groups
        - schema:
            type: string
            format: uuid
          in: query
          name: uploader
        - schema:
            type: string
            format: uuid
          in: query
          name: manga
        - schema:
            oneOf:
              - type: string
              - type: array
                items:
                  type: string
          in: query
          name: volume
        - schema:
            oneOf:
              - type: string
              - type: array
                items:
                  type: string
          in: query
          name: chapter
        - schema:
            type: array
            items:
              type: string
              pattern: '^[a-zA-Z\-]{2,5}$'
          in: query
          name: translatedLanguage
        - schema:
            type: string
            description: "DateTime string with following format: YYYY-MM-DDTHH:MM:SS"
            pattern: ^\d{4}-[0-1]\d-([0-2]\d|3[0-1])T([0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$
          in: query
          name: createdAtSince
        - schema:
            type: string
            description: "DateTime string with following format: YYYY-MM-DDTHH:MM:SS"
            pattern: ^\d{4}-[0-1]\d-([0-2]\d|3[0-1])T([0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$
          in: query
          name: updatedAtSince
        - schema:
            type: string
            description: "DateTime string with following format: YYYY-MM-DDTHH:MM:SS"
            pattern: ^\d{4}-[0-1]\d-([0-2]\d|3[0-1])T([0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$
          in: query
          name: publishAtSince
        - schema:
            type: object
            properties:
              createdAt:
                type: string
                enum:
                  - asc
                  - desc
              updatedAt:
                type: string
                enum:
                  - asc
                  - desc
              publishAt:
                type: string
                enum:
                  - asc
                  - desc
              volume:
                type: string
                enum:
                  - asc
                  - desc
              chapter:
                type: string
                enum:
                  - asc
                  - desc
          in: query
          name: order
        - schema:
            type: array
            items:
              type: string
          in: query
          name: includes
      tags:
        - Chapter
        - Search
      security: []
  '/chapter/{id}':
    parameters:
      - schema:
          type: string
          format: uuid
        name: id
        in: path
        required: true
        description: Chapter ID
    get:
      summary: Get Chapter
      tags:
        - Chapter
      parameters:
        - schema:
            type: array
            items:
              type: string
          in: query
          name: includes
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChapterResponse'
              examples:
                example-1:
                  value:
                    result: ok
                    data:
                      id: 497f6eca-6276-4993-bfeb-53cbbbba6f08
                      type: chapter
                      attributes:
                        title: string
                        volume: null
                        chapter: null
                        translatedLanguage: jp
                        data:
                          - x1-b765e86d5ecbc932cf3f517a8604f6ac6d8a7f379b0277a117dc7c09c53d041e.png
                          - x2-fc7c198880083b053bf4e8aebfc0eec1adbe52878a6c5ff08d25544a1d5502ef.png
                          - x3-90f15bc8b91deb0dc88473b532e42a99f93ee9e2c8073795c81b01fff428af80.png
                        dataSaver:
                          - x1-ab2b7c8f30c843aa3a53c29bc8c0e204fba4ab3e75985d761921eb6a52ff6159.jpg
                          - x2-3e057d937e01696adce2ac2865f62f6f6a15f03cef43d929b88e99a4b8482e03.jpg
                          - x3-128742088f99806b022bbc8006554456f2a20d0d176d7f3264a65ff9a549d0dd.jpg
                        uploader: 4df808f4-cdf8-4d1c-80e6-4af8e6ce09b8
                        version: 1
                        groups:
                          - 497f6eca-6276-4993-bfeb-53cbbbba6f08
                        manga: e7116dd3-e4ad-4d10-a3ef-6a64d730c341
                    relationships:
                      - id: 497f6eca-6276-4993-bfeb-53cbbbba6f08
                        type: string
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Chapter not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      operationId: get-chapter-id
      security: []
    put:
      summary: Update Chapter
      operationId: put-chapter-id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChapterResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChapterEdit'
        description: The size of the body is limited to 32KB.
      tags:
        - Chapter
    delete:
      summary: Delete Chapter
      operationId: delete-chapter-id
      responses:
        '200':
          description: Chapter has been deleted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Response'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - Chapter
  /user/follows/manga/feed:
    get:
      summary: Get logged User followed Manga feed (Chapter list)
      tags:
        - Manga
        - Chapter
        - Feed
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChapterList'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: User not Found
      operationId: get-user-follows-manga-feed
      parameters:
        - schema:
            type: integer
            default: 100
            minimum: 1
            maximum: 500
          in: query
          name: limit
        - schema:
            type: integer
            minimum: 0
          in: query
          name: offset
        - schema:
            type: array
            items:
              type: string
              pattern: '^[a-zA-Z\-]{2,5}$'
          in: query
          name: translatedLanguage
        - schema:
            type: string
            description: "DateTime string with following format: YYYY-MM-DDTHH:MM:SS"
            pattern: ^\d{4}-[0-1]\d-([0-2]\d|3[0-1])T([0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$
          in: query
          name: createdAtSince
        - schema:
            type: string
            description: "DateTime string with following format: YYYY-MM-DDTHH:MM:SS"
            pattern: ^\d{4}-[0-1]\d-([0-2]\d|3[0-1])T([0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$
          in: query
          name: updatedAtSince
        - schema:
            type: string
            description: "DateTime string with following format: YYYY-MM-DDTHH:MM:SS"
            pattern: ^\d{4}-[0-1]\d-([0-2]\d|3[0-1])T([0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$
          in: query
          name: publishAtSince
        - schema:
            type: object
            properties:
              createdAt:
                type: string
                enum:
                  - asc
                  - desc
              updatedAt:
                type: string
                enum:
                  - asc
                  - desc
              publishAt:
                type: string
                enum:
                  - asc
                  - desc
              volume:
                type: string
                enum:
                  - asc
                  - desc
              chapter:
                type: string
                enum:
                  - asc
                  - desc
          in: query
          name: order
  '/list/{id}/feed':
    parameters:
      - schema:
          type: string
          format: uuid
        name: id
        in: path
        required: true
    get:
      summary: CustomList Manga feed
      tags:
        - CustomList
        - Feed
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChapterList'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      operationId: get-list-id-feed
      parameters:
        - schema:
            type: integer
            default: 100
            minimum: 1
            maximum: 500
          in: query
          name: limit
        - schema:
            type: integer
            minimum: 0
          in: query
          name: offset
        - schema:
            type: array
            items:
              type: string
              pattern: '^[a-zA-Z\-]{2,5}$'
          in: query
          name: translatedLanguage
        - schema:
            type: string
            description: "DateTime string with following format: YYYY-MM-DDTHH:MM:SS"
            pattern: ^\d{4}-[0-1]\d-([0-2]\d|3[0-1])T([0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$
          in: query
          name: createdAtSince
        - schema:
            type: string
            description: "DateTime string with following format: YYYY-MM-DDTHH:MM:SS"
            pattern: ^\d{4}-[0-1]\d-([0-2]\d|3[0-1])T([0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$
          in: query
          name: updatedAtSince
        - schema:
            type: string
            description: "DateTime string with following format: YYYY-MM-DDTHH:MM:SS"
            pattern: ^\d{4}-[0-1]\d-([0-2]\d|3[0-1])T([0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$
          in: query
          name: publishAtSince
        - schema:
            type: object
            properties:
              volume:
                type: string
                enum:
                  - asc
                  - desc
              chapter:
                type: string
                enum:
                  - asc
                  - desc
          in: query
          name: order
  '/manga/{id}/follow':
    parameters:
      - schema:
          type: string
          format: uuid
        name: id
        in: path
        required: true
    delete:
      summary: Unfollow Manga
      operationId: delete-manga-id-follow
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Response'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - Manga
    post:
      summary: Follow Manga
      operationId: post-manga-id-follow
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Response'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - Manga
  /cover:
    get:
      summary: CoverArt list
      tags:
        - Cover
        - Search
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CoverList'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      operationId: get-cover
      parameters:
        - schema:
            type: integer
            default: 10
            minimum: 1
            maximum: 100
          in: query
          name: limit
        - schema:
            type: integer
            minimum: 0
          in: query
          name: offset
        - schema:
            type: array
            items:
              type: string
              format: uuid
          in: query
          name: manga
          description: Manga ids (limited to 100 per request)
        - schema:
            type: array
            items:
              type: string
              format: uuid
          in: query
          name: ids
          description: Covers ids (limited to 100 per request)
        - schema:
            type: array
            items:
              type: string
              format: uuid
          in: query
          name: uploaders
          description: User ids (limited to 100 per request)
        - schema:
            type: object
            properties:
              createdAt:
                type: string
                enum:
                  - asc
                  - desc
              updatedAt:
                type: string
                enum:
                  - asc
                  - desc
              volume:
                type: string
                enum:
                  - asc
                  - desc
          in: query
          name: order
        - schema:
            type: array
            items:
              type: string
          in: query
          name: includes
      security: []
  /cover/{mangaId}:
    post:
      summary: Upload Cover
      tags:
        - Cover
        - Upload
      operationId: upload-cover
      parameters:
        - schema:
            type: string
            format: uuid
          name: mangaId
          in: path
          required: true
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CoverResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /cover/{coverId}:
    parameters:
      - schema:
          type: string
          format: uuid
        name: coverId
        in: path
        required: true
    get:
      summary: Get Cover
      tags:
        - Cover
      operationId: get-cover-id
      parameters:
        - schema:
            type: array
            items:
              type: string
          in: query
          name: includes
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CoverResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: CoverArt not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security: []
    put:
      summary: Edit Cover
      tags:
        - Cover
      operationId: edit-cover
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CoverEdit'
        description: The size of the body is limited to 2KB.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CoverResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
    delete:
      summary: Delete Cover
      tags:
        - Cover
      operationId: delete-cover
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Response'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /author:
    get:
      summary: Author list
      tags:
        - Author
        - Search
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthorList'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      operationId: get-author
      parameters:
        - schema:
            type: integer
            default: 10
            minimum: 1
            maximum: 100
          in: query
          name: limit
        - schema:
            type: integer
            minimum: 0
          in: query
          name: offset
        - schema:
            type: array
            items:
              type: string
              format: uuid
          in: query
          name: ids
          description: Author ids (limited to 100 per request)
        - schema:
            type: string
          in: query
          name: name
        - schema:
            type: object
            properties:
              name:
                type: string
                enum: ['asc', 'desc']
          in: query
          name: order
        - schema:
            type: array
            items:
              type: string
          in: query
          name: includes
      security: []
    post:
      summary: Create Author
      operationId: post-author
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthorResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - Author
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AuthorCreate'
        description: The size of the body is limited to 2KB.
  '/author/{id}':
    parameters:
      - schema:
          type: string
          format: uuid
        name: id
        in: path
        required: true
        description: Author ID
    get:
      summary: Get Author
      tags:
        - Author
      parameters:
        - schema:
            type: array
            items:
              type: string
          in: query
          name: includes
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Author no content
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      operationId: get-author-id
      security: []
    put:
      summary: Update Author
      operationId: put-author-id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthorResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AuthorEdit'
        description: The size of the body is limited to 2KB.
      tags:
        - Author
    delete:
      summary: Delete Author
      operationId: delete-author-id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Response'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - Author
  /legacy/mapping:
    post:
      summary: Legacy ID mapping
      operationId: post-legacy-mapping
      responses:
        '200':
          description: This response will give you an array of mappings of resource identifiers ; the `data.attributes.newId` field corresponds to the new UUID.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/MappingIdResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - Legacy
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MappingIdBody'
        description: The size of the body is limited to 10KB.
      security: []
  '/manga/{id}/feed':
    parameters:
      - schema:
          type: string
          format: uuid
        name: id
        in: path
        required: true
        description: Manga ID
    get:
      summary: Manga feed
      tags:
        - Manga
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChapterList'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      operationId: get-manga-id-feed
      parameters:
        - schema:
            type: integer
            default: 100
            minimum: 1
            maximum: 500
          in: query
          name: limit
        - schema:
            type: integer
            minimum: 0
          in: query
          name: offset
        - schema:
            type: array
            items:
              type: string
              pattern: '^[a-zA-Z\-]{2,5}$'
          in: query
          name: translatedLanguage
        - schema:
            type: string
            description: "DateTime string with following format: YYYY-MM-DDTHH:MM:SS"
            pattern: ^\d{4}-[0-1]\d-([0-2]\d|3[0-1])T([0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$
          in: query
          name: createdAtSince
        - schema:
            type: string
            description: "DateTime string with following format: YYYY-MM-DDTHH:MM:SS"
            pattern: ^\d{4}-[0-1]\d-([0-2]\d|3[0-1])T([0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$
          in: query
          name: updatedAtSince
        - schema:
            type: string
            description: "DateTime string with following format: YYYY-MM-DDTHH:MM:SS"
            pattern: ^\d{4}-[0-1]\d-([0-2]\d|3[0-1])T([0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$
          in: query
          name: publishAtSince
        - schema:
            type: object
            properties:
              volume:
                type: string
                enum:
                  - asc
                  - desc
              chapter:
                type: string
                enum:
                  - asc
                  - desc
          in: query
          name: order
        - schema:
            type: array
            items:
              type: string
          in: query
          name: includes
      security: []
  '/manga/{id}/read':
    parameters:
      - schema:
          type: string
          format: uuid
        name: id
        in: path
        required: true
    get:
      summary: Manga read markers
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  result:
                    type: string
                    enum:
                      - ok
                  data:
                    type: array
                    items:
                      type: string
                      format: uuid
              examples:
                example-1:
                  value:
                    result: ok
                    data:
                      - 00057883-357b-4734-9469-52967e59ef4c
                      - 000b7978-d9bd-49ec-a8f6-a0737368415f
                      - 0015b621-a175-47f5-81fb-5976c88e18c4
      operationId: get-manga-chapter-readmarkers
      description: A list of chapter ids that are marked as read for the specified manga
      tags:
        - Manga
  '/manga/read':
    get:
      summary: Manga read markers
      parameters:
        - schema:
            type: array
            items:
              type: string
              format: uuid
          in: query
          name: ids
          description: Manga ids
          required: true
        - name: grouped
          in: query
          schema:
            type: boolean
          description: Group results by manga ids
          required: false
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  result:
                    type: string
                    enum:
                      - ok
                  data:
                    oneOf:
                      - type: array
                        items:
                          type: string
                          format: uuid
                      - type: object
                        additionalProperties:
                          type: array
                          items:
                            type: string
                            format: uuid
              examples:
                example-default:
                  value:
                    result: ok
                    data:
                      - 00057883-357b-4734-9469-52967e59ef4c
                      - 000b7978-d9bd-49ec-a8f6-a0737368415f
                      - 0015b621-a175-47f5-81fb-5976c88e18c4
                example-grouped:
                  value:
                    result: ok
                    data:
                      40529c30-0d25-4da5-a25a-f71a961ab855:
                        - 00057883-357b-4734-9469-52967e59ef4c
                        - 000b7978-d9bd-49ec-a8f6-a0737368415f
                        - 0015b621-a175-47f5-81fb-5976c88e18c4
      operationId: get-manga-chapter-readmarkers-2
      description: A list of chapter ids that are marked as read for the given manga ids
      tags:
        - Manga
  '/chapter/{id}/read':
    parameters:
      - schema:
          type: string
          format: uuid
        name: id
        in: path
        required: true
    post:
      summary: Mark Chapter read
      tags:
        - Chapter
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  result:
                    type: string
                    enum:
                      - ok
                      - error
      operationId: chapter-id-read
      description: Mark chapter as read for the current user
    delete:
      summary: Mark Chapter unread
      tags:
        - Chapter
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  result:
                    type: string
                    enum:
                      - ok
                      - error
      operationId: chapter-id-unread
      description: Mark chapter as unread for the current user
  /manga/random:
    get:
      summary: Get a random Manga
      tags:
        - Manga
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MangaResponse'
      operationId: get-manga-random
      parameters:
        - schema:
            type: array
            items:
              type: string
          in: query
          name: includes
      security: []
  '/at-home/server/{chapterId}':
    parameters:
      - schema:
          type: string
          format: uuid
        name: chapterId
        in: path
        required: true
        description: Chapter ID
    get:
      summary: Get MangaDex@Home server URL
      tags:
        - AtHome
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  baseUrl:
                    type: string
                    description: |-
                      The base URL to construct final image URLs from.
                      The URL returned is valid for the requested chapter only, and for a duration of 15 minutes from the time of the response.
                example:
                  baseUrl: https://abcdef.xyz123.mangadex.network:12345/some-temporary-access-token
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      operationId: get-at-home-server-chapterId
      parameters:
        - schema:
            type: boolean
            default: false
          in: query
          name: forcePort443
          description: |-
            Force selecting from MangaDex@Home servers that use the standard HTTPS port 443.

            While the conventional port for HTTPS traffic is 443 and servers are encouraged to use it, it is not a hard requirement as it technically isn't
            anything special.

            However, some misbehaving school/office network will at time block traffic to non-standard ports, and setting this flag to `true` will ensure
            selection of a server that uses these.
      security: []
  /manga/tag:
    get:
      summary: Tag list
      tags:
        - Manga
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/TagResponse'
      operationId: get-manga-tag
      security: []
  /account/activate/resend:
    post:
      summary: Resend Activation code
      operationId: post-account-activate-resend
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccountActivateResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - Account
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SendAccountActivationCode'
        description: The size of the body is limited to 1KB.
      security: []
  /account/recover:
    post:
      summary: Recover given Account
      operationId: post-account-recover
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccountActivateResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: ''
      tags:
        - Account
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SendAccountActivationCode'
        description: The size of the body is limited to 1KB.
      security: []
  '/account/recover/{code}':
    parameters:
      - schema:
          type: string
        name: code
        in: path
        required: true
    post:
      summary: Complete Account recover
      operationId: post-account-recover-code
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccountActivateResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - Account
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RecoverCompleteBody'
        description: The size of the body is limited to 2KB.
      security: []
  /user/me:
    get:
      summary: Logged User details
      tags:
        - User
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserResponse'
      operationId: get-user-me
  /user/follows/group:
    get:
      summary: Get logged User followed Groups
      tags:
        - ScanlationGroup
        - User
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScanlationGroupList'
      operationId: get-user-follows-group
      parameters:
        - schema:
            type: integer
            default: 10
            minimum: 1
            maximum: 100
          in: query
          name: limit
        - schema:
            type: integer
            minimum: 0
          in: query
          name: offset
  /user/follows/user:
    get:
      summary: Get logged User followed User list
      tags:
        - User
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserList'
      operationId: get-user-follows-user
      parameters:
        - schema:
            type: integer
            default: 10
            minimum: 1
            maximum: 100
          in: query
          name: limit
        - schema:
            type: integer
            minimum: 0
          in: query
          name: offset
  /user/follows/manga:
    get:
      summary: Get logged User followed Manga list
      tags:
        - Manga
        - User
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MangaList'
      operationId: get-user-follows-manga
      parameters:
        - schema:
            type: integer
            default: 10
            minimum: 1
            maximum: 100
          in: query
          name: limit
        - schema:
            type: integer
            minimum: 0
          in: query
          name: offset
  /manga/status:
    get:
      summary: Get all Manga reading status for logged User
      operationId: get-manga-status
      tags:
        - Manga
      parameters:
        - schema:
            type: string
            enum:
              - reading
              - on_hold
              - plan_to_read
              - dropped
              - re_reading
              - completed
          in: query
          name: status
          description: Used to filter the list by given status
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  result:
                    type: string
                    default: ok
                  statuses:
                    type: object
                    additionalProperties:
                      type: string
                      enum:
                        - reading
                        - on_hold
                        - plan_to_read
                        - dropped
                        - re_reading
                        - completed
              examples:
                unfiltered:
                  summary: /manga/status
                  value:
                    result: ok
                    statuses:
                      b019ea5d-5fe6-44d4-abbc-f546f210884d: reading
                      2394a5c7-1d2e-461f-acde-18726b9e37d6: dropped
                filtered:
                  summary: /manga/status?status=reading
                  value:
                    result: ok
                    statuses:
                      b019ea5d-5fe6-44d4-abbc-f546f210884d: reading
  '/manga/{id}/status':
    parameters:
      - schema:
          type: string
          format: uuid
        name: id
        in: path
        required: true
    get:
      summary: Get a Manga reading status
      operationId: get-manga-id-status
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  result:
                    type: string
                    default: ok
                  status:
                    type: string
                    enum:
                      - reading
                      - on_hold
                      - plan_to_read
                      - dropped
                      - re_reading
                      - completed
                example:
                  result: ok
                  status: reading
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - Manga
    post:
      summary: Update Manga reading status
      operationId: post-manga-id-status
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Response'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
        - Manga
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateMangaStatus'
        description: Using a `null` value in `status` field will remove the Manga reading status. The size of the body is limited to 2KB.
  /captcha/solve:
    post:
      summary: Solve Captcha
      tags:
        - Captcha
      responses:
        '200':
          description: 'OK: Captcha has been solved'
          content:
            application/json:
              schema:
                type: object
                properties:
                  result:
                    type: string
                    enum:
                      - ok
                      - error
        '400':
          description: 'Bad Request: Captcha challenge result was wrong, the Captcha Verification service was down or other, refer to the error message and the errorCode inside the error context'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      operationId: post-captcha-solve
      requestBody:
        content:
          application/json:
            schema:
              description: ''
              type: object
              properties:
                captchaChallenge:
                  type: string
                  minLength: 1
              required:
                - captchaChallenge
            examples:
              example-1:
                value:
                  captchaChallenge: string
      description: |-
        Captchas can be solved explicitly through this endpoint, another way is to add a `X-Captcha-Result` header to any request. The same logic will verify the captcha and is probably more convenient because it takes one less request.

        Authentication is optional. Captchas are tracked for both the client ip and for the user id, if you are logged in you want to send your session token but that is not required.
      security:
        - Bearer: []
components:
  schemas:
    MangaRequest:
      description: ''
      type: object
      title: MangaRequest
      properties:
        title:
          $ref: '#/components/schemas/LocalizedString'
        altTitles:
          type: array
          items:
            $ref: '#/components/schemas/LocalizedString'
        description:
          $ref: '#/components/schemas/LocalizedString'
        authors:
          type: array
          items:
            type: string
            format: uuid
        artists:
          type: array
          items:
            type: string
            format: uuid
        links:
          type: object
          additionalProperties:
            type: string
        originalLanguage:
          type: string
          pattern: '^[a-zA-Z\-]{2,5}$'
        lastVolume:
          type: string
          nullable: true
        lastChapter:
          type: string
          nullable: true
        publicationDemographic:
          type: string
          nullable: true
          enum:
            - shounen
            - shoujo
            - josei
            - seinen
        status:
          type: string
          nullable: true
          enum:
            - ongoing
            - completed
            - hiatus
            - cancelled
        year:
          type: integer
          nullable: true
          maximum: 9999
          minimum: 1
          description: Year of release
        contentRating:
          type: string
          nullable: true
          enum:
            - safe
            - suggestive
            - erotica
            - pornographic
        modNotes:
          type: string
          nullable: true
        version:
          type: integer
          minimum: 1
    LocalizedString:
      type: object
      title: LocalizedString
      additionalProperties:
        type: string
        pattern: "^[a-z]{2,8}$"
    MangaResponse:
      title: MangaResponse
      type: object
      properties:
        result:
          type: string
          enum:
            - ok
            - error
        data:
          $ref: '#/components/schemas/Manga'
        relationships:
          type: array
          items:
            $ref: '#/components/schemas/Relationship'
    ChapterResponse:
      title: ChapterResponse
      type: object
      properties:
        result:
          type: string
          enum:
            - ok
            - error
        data:
          $ref: '#/components/schemas/Chapter'
        relationships:
          type: array
          items:
            $ref: '#/components/schemas/Relationship'
    Relationship:
      title: Relationship
      type: object
      properties:
        id:
          type: string
          format: uuid
        type:
          type: string
        attributes:
          description: If Reference Expansion is applied, contains objects attributes
          nullable: true
          type: object
    Chapter:
      title: Chapter
      type: object
      x-examples:
        example:
          id: a05de006-df86-4fe1-9d20-32664a78c1cc
          type: chapter
          attributes:
            title: Chapter title
            volume: 1
            chapter: '15.1'
            uploader:
              id: 23d52040-3a77-4ffe-84dd-6dbf259e32ed
              type: user
              attributes: []
            manga:
              id: 439ea5a9-e922-44d1-b9c1-a3e1158bd55f
              type: manga
              attributes: []
            groups:
              - id: cb4cf9ac-ee21-486f-ab0f-21b17ba0ab7f
                type: scanlation_group
                attributes: []
            translatedLanguage: en
            data:
              - x1-b765e86d5ecbc932cf3f517a8604f6ac6d8a7f379b0277a117dc7c09c53d041e.png
              - x2-fc7c198880083b053bf4e8aebfc0eec1adbe52878a6c5ff08d25544a1d5502ef.png
              - x3-90f15bc8b91deb0dc88473b532e42a99f93ee9e2c8073795c81b01fff428af80.png
            dataSaver:
              - x1-ab2b7c8f30c843aa3a53c29bc8c0e204fba4ab3e75985d761921eb6a52ff6159.jpg
              - x2-3e057d937e01696adce2ac2865f62f6f6a15f03cef43d929b88e99a4b8482e03.jpg
              - x3-128742088f99806b022bbc8006554456f2a20d0d176d7f3264a65ff9a549d0dd.jpg
            version: 1
      properties:
        id:
          type: string
          format: uuid
        type:
          type: string
          enum:
            - chapter
        attributes:
          $ref: '#/components/schemas/ChapterAttributes'
    Manga:
      title: Manga
      type: object
      x-examples:
        example:
          id: a05de006-df86-4fe1-9d20-32664a78c1cc
          type: manga
          attributes:
            title:
              en: English title
              de: Deutscher Titel
              jp: 日本語題名
            altTitles:
              - en: Secondary english title
              - en: Third english title
              - romaji: Romaji title
            description:
              en: Nice description
            isLocked: false
            originalLanguage: jp
            year: 2020
            version: 1
      properties:
        id:
          type: string
          format: uuid
        type:
          type: string
          enum:
            - manga
        attributes:
          $ref: '#/components/schemas/MangaAttributes'
    ErrorResponse:
      title: ErrorResponse
      type: object
      properties:
        result:
          type: string
          default: error
        errors:
          type: array
          items:
            $ref: '#/components/schemas/Error'
    Error:
      title: Error
      type: object
      properties:
        id:
          type: string
        status:
          type: integer
        title:
          type: string
        detail:
          type: string
    ChapterAttributes:
      title: ChapterAttributes
      type: object
      properties:
        title:
          type: string
          maxLength: 255
        volume:
          type: string
          nullable: true
        chapter:
          type: string
          nullable: true
          maxLength: 8
        translatedLanguage:
          type: string
          pattern: '^[a-zA-Z\-]{2,5}$'
        hash:
          type: string
        data:
          type: array
          items:
            type: string
        dataSaver:
          type: array
          items:
            type: string
        uploader:
          type: string
          format: uuid
        version:
          type: integer
          minimum: 1
        createdAt:
          type: string
        updatedAt:
          type: string
        publishAt:
          type: string
    MangaAttributes:
      title: MangaAttributes
      type: object
      properties:
        title:
          $ref: '#/components/schemas/LocalizedString'
        altTitles:
          type: array
          items:
            $ref: '#/components/schemas/LocalizedString'
        description:
          $ref: '#/components/schemas/LocalizedString'
        isLocked:
          type: boolean
        links:
          type: object
          additionalProperties:
            type: string
        originalLanguage:
          type: string
        lastVolume:
          type: string
          nullable: true
        lastChapter:
          type: string
          nullable: true
        publicationDemographic:
          type: string
          nullable: true
        status:
          type: string
          nullable: true
        year:
          type: integer
          nullable: true
          description: Year of release
        contentRating:
          type: string
          nullable: true
        tags:
          type: array
          items:
            $ref: '#/components/schemas/Tag'
        version:
          type: integer
          minimum: 1
        createdAt:
          type: string
        updatedAt:
          type: string
    MangaCreate:
      allOf:
        - $ref: '#/components/schemas/MangaRequest'
        - required:
            - title
    MangaEdit:
      allOf:
        - $ref: '#/components/schemas/MangaRequest'
        - required:
            - version
    ChapterEdit:
      allOf:
        - $ref: '#/components/schemas/ChapterRequest'
        - required:
            - version
    Response:
      title: Response
      type: object
      properties:
        result:
          type: string
          enum:
            - ok
            - error
    Login:
      type: object
      title: Login
      additionalProperties: false
      properties:
        username:
          type: string
          minLength: 1
          maxLength: 64
        password:
          type: string
          minLength: 8
          maxLength: 1024
      required:
        - username
        - password
    LoginResponse:
      title: LoginResponse
      type: object
      properties:
        result:
          type: string
          enum:
            - ok
            - error
        token:
          type: object
          properties:
            session:
              type: string
            refresh:
              type: string
    CheckResponse:
      title: CheckResponse
      type: object
      description: ''
      properties:
        result:
          type: string
          default: ok
        isAuthenticated:
          type: boolean
        roles:
          type: array
          items:
            type: string
        permissions:
          type: array
          items:
            type: string
    LogoutResponse:
      title: LogoutResponse
      type: object
      properties:
        result:
          type: string
          enum:
            - ok
            - error
    RefreshToken:
      type: object
      title: RefreshToken
      additionalProperties: false
      properties:
        token:
          type: string
          minLength: 1
      required:
        - token
    RefreshResponse:
      title: RefreshResponse
      type: object
      properties:
        result:
          type: string
          enum:
            - ok
            - error
        token:
          type: object
          properties:
            session:
              type: string
            refresh:
              type: string
        message:
          type: string
      required:
        - result
    AccountActivateResponse:
      title: AccountActivateResponse
      type: object
      properties:
        result:
          type: string
          enum:
            - ok
    CreateAccount:
      title: CreateAccount
      type: object
      properties:
        username:
          type: string
          minLength: 1
          maxLength: 64
        password:
          type: string
          minLength: 8
          maxLength: 1024
        email:
          type: string
          format: email
      required:
        - username
        - password
        - email
    ScanlationGroupResponse:
      title: ScanlationGroupResponse
      type: object
      properties:
        result:
          type: string
          enum:
            - ok
        data:
          $ref: '#/components/schemas/ScanlationGroup'
        relationships:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
              type:
                type: string
    ScanlationGroup:
      title: ScanlationGroup
      type: object
      properties:
        id:
          type: string
          format: uuid
        type:
          type: string
          enum:
            - scanlation_group
        attributes:
          $ref: '#/components/schemas/ScanlationGroupAttributes'
    ScanlationGroupAttributes:
      title: ScanlationGroupAttributes
      type: object
      properties:
        name:
          type: string
        leader:
          $ref: '#/components/schemas/User'
        version:
          type: integer
          minimum: 1
        createdAt:
          type: string
        updatedAt:
          type: string
    User:
      title: User
      type: object
      properties:
        id:
          type: string
          format: uuid
        type:
          type: string
          enum:
            - user
        attributes:
          $ref: '#/components/schemas/UserAttributes'
    UserAttributes:
      title: UserAttributes
      type: object
      properties:
        username:
          type: string
        version:
          type: integer
          minimum: 1
    CreateScanlationGroup:
      title: CreateScanlationGroup
      type: object
      properties:
        name:
          type: string
        leader:
          type: string
          format: uuid
        members:
          type: array
          items:
            type: string
            format: uuid
        version:
          type: integer
          minimum: 1
      required:
        - name
    ScanlationGroupEdit:
      title: ScanlationGroupEdit
      type: object
      properties:
        name:
          type: string
        leader:
          type: string
          format: uuid
        members:
          type: array
          items:
            type: string
            format: uuid
        version:
          type: integer
          minimum: 1
      required:
        - version
    CustomListCreate:
      title: CustomListCreate
      type: object
      properties:
        name:
          type: string
        visibility:
          type: string
          enum:
            - public
            - private
        manga:
          type: array
          items:
            type: string
            format: uuid
        version:
          type: integer
          minimum: 1
      required:
        - name
    CustomListEdit:
      title: CustomListEdit
      type: object
      properties:
        name:
          type: string
        visibility:
          type: string
          enum:
            - public
            - private
        manga:
          type: array
          items:
            type: string
            format: uuid
        version:
          type: integer
          minimum: 1
      required:
        - version
    CustomListResponse:
      title: CustomListResponse
      type: object
      properties:
        result:
          type: string
          enum:
            - ok
            - error
        data:
          $ref: '#/components/schemas/CustomList'
        relationships:
          type: array
          items:
            $ref: '#/components/schemas/Relationship'
    CustomList:
      title: CustomList
      type: object
      properties:
        id:
          type: string
          format: uuid
        type:
          type: string
          enum:
            - custom_list
        attributes:
          $ref: '#/components/schemas/CustomListAttributes'
    CustomListAttributes:
      title: CustomListAttributes
      type: object
      properties:
        name:
          type: string
        visibility:
          type: string
          enum:
            - private
            - public
        owner:
          $ref: '#/components/schemas/User'
        version:
          type: integer
          minimum: 1
    CoverResponse:
      title: CoverResponse
      type: object
      properties:
        result:
          type: string
        data:
          $ref: '#/components/schemas/Cover'
        relationships:
          type: array
          items:
            $ref: '#/components/schemas/Relationship'
    Cover:
      title: Cover
      type: object
      properties:
        id:
          type: string
          format: uuid
        type:
          type: string
          enum:
            - cover_art
        attributes:
          $ref: '#/components/schemas/CoverAttributes'
    CoverAttributes:
      title: CoverAttributes
      type: object
      properties:
        volume:
          type: string
          nullable: true
        fileName:
          type: string
        description:
          type: string
          nullable: true
        version:
          type: integer
          minimum: 1
        createdAt:
          type: string
        updatedAt:
          type: string
    CoverEdit:
      title: CoverEdit
      type: object
      properties:
        volume:
          type: string
          nullable: true
          minLength: 0
          maxLength: 8
        description:
          type: string
          nullable: true
          minLength: 0
          maxLength: 512
        version:
          type: integer
          minimum: 1
      required:
        - version
        - volume
    AuthorResponse:
      title: AuthorResponse
      type: object
      properties:
        result:
          type: string
        data:
          $ref: '#/components/schemas/Author'
        relationships:
          type: array
          items:
            $ref: '#/components/schemas/Relationship'
    Author:
      title: Author
      type: object
      properties:
        id:
          type: string
          format: uuid
        type:
          type: string
          enum:
            - author
        attributes:
          $ref: '#/components/schemas/AuthorAttributes'
    AuthorAttributes:
      title: AuthorAttributes
      type: object
      properties:
        name:
          type: string
        imageUrl:
          type: string
        biography:
          type: object
          additionalProperties:
            type: string
        version:
          type: integer
          minimum: 1
        createdAt:
          type: string
        updatedAt:
          type: string
    AuthorEdit:
      title: AuthorEdit
      type: object
      properties:
        name:
          type: string
        version:
          type: integer
          minimum: 1
      required:
        - version
    AuthorCreate:
      type: object
      title: AuthorCreate
      additionalProperties: false
      properties:
        name:
          type: string
        version:
          type: integer
          minimum: 1
      required:
        - name
    MappingIdBody:
      type: object
      title: MappingIdBody
      additionalProperties: false
      properties:
        type:
          type: string
          enum:
            - group
            - manga
            - chapter
            - tag
        ids:
          type: array
          items:
            type: integer
    MappingIdResponse:
      title: MappingIdResponse
      type: object
      properties:
        result:
          type: string
          enum:
            - ok
        data:
          $ref: '#/components/schemas/MappingId'
        relationships:
          type: array
          items:
            $ref: '#/components/schemas/Relationship'
    MappingId:
      title: MappingId
      type: object
      properties:
        id:
          type: string
          format: uuid
        type:
          type: string
          enum:
            - mapping_id
        attributes:
          $ref: '#/components/schemas/MappingIdAttributes'
    MappingIdAttributes:
      title: MappingIdAttributes
      type: object
      properties:
        type:
          type: string
          enum:
            - manga
            - chapter
            - group
            - tag
        legacyId:
          type: integer
        newId:
          type: string
          format: uuid
    TagResponse:
      title: TagResponse
      type: object
      properties:
        result:
          type: string
          enum:
            - ok
        data:
          $ref: '#/components/schemas/Tag'
        relationships:
          type: array
          items:
            $ref: '#/components/schemas/Relationship'
    Tag:
      title: Tag
      type: object
      properties:
        id:
          type: string
          format: uuid
        type:
          type: string
          enum:
            - tag
        attributes:
          $ref: '#/components/schemas/TagAttributes'
    TagAttributes:
      title: TagAttributes
      type: object
      properties:
        name:
          $ref: '#/components/schemas/LocalizedString'
        description:
          $ref: '#/components/schemas/LocalizedString'
        group:
          type: string
        version:
          type: integer
          minimum: 1
    UserResponse:
      title: UserResponse
      type: object
      properties:
        result:
          type: string
          enum:
            - ok
        data:
          $ref: '#/components/schemas/User'
        relationships:
          type: array
          items:
            $ref: '#/components/schemas/Relationship'
    SendAccountActivationCode:
      type: object
      title: SendAccountActivationCode
      additionalProperties: false
      properties:
        email:
          type: string
          format: email
      required:
        - email
    RecoverCompleteBody:
      type: object
      title: RecoverCompleteBody
      additionalProperties: false
      properties:
        newPassword:
          type: string
          minLength: 8
          maxLength: 1024
      required:
        - newPassword
    UpdateMangaStatus:
      title: UpdateMangaStatus
      type: object
      properties:
        status:
          type: string
          nullable: true
          enum:
            - reading
            - on_hold
            - plan_to_read
            - dropped
            - re_reading
            - completed
      required:
        - status
    ChapterRequest:
      title: ChapterRequest
      type: object
      properties:
        title:
          type: string
          maxLength: 255
        volume:
          type: string
          nullable: true
        chapter:
          type: string
          nullable: true
          maxLength: 8
        translatedLanguage:
          type: string
          pattern: '^[a-zA-Z\-]{2,5}$'
        data:
          type: array
          items:
            type: string
        dataSaver:
          type: array
          items:
            type: string
        version:
          type: integer
          minimum: 1
    CoverList:
      title: CoverList
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/CoverResponse'
        limit:
          type: integer
        offset:
          type: integer
        total:
          type: integer
    AuthorList:
      title: AuthorList
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/AuthorResponse'
        limit:
          type: integer
        offset:
          type: integer
        total:
          type: integer
    ChapterList:
      title: ChapterList
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/ChapterResponse'
        limit:
          type: integer
        offset:
          type: integer
        total:
          type: integer
    ScanlationGroupList:
      title: ScanlationGroupList
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/ScanlationGroupResponse'
        limit:
          type: integer
        offset:
          type: integer
        total:
          type: integer
    MangaList:
      title: MangaList
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/MangaResponse'
        limit:
          type: integer
        offset:
          type: integer
        total:
          type: integer
    CustomListList:
      title: CustomListList
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/CustomListResponse'
        limit:
          type: integer
        offset:
          type: integer
        total:
          type: integer
    UserList:
      title: UserList
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/UserResponse'
        limit:
          type: integer
        offset:
          type: integer
        total:
          type: integer
  securitySchemes:
    Bearer:
      type: http
      scheme: bearer
security:
  - Bearer: []