Ctrl K
ComunidadGuías…

api/rest/mantisbt_openapi.yaml

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

Archivo original ↗Preguntar a KiBot
# MantisBT REST API definition
# Copyright 2024 MantisBT Team - mantisbt-dev@lists.sourceforge.net

openapi: 3.0.3
info:
  title: Mantis Bug Tracker REST API
  version: 2.29.0-dev
  description: |-
    REST API calls have to be authenticated by creating an API token for the user doing the calls,
    and then passing the API token in the 'Authorization' header.  However, for anonymous access,
    the API key and header are not needed.

    The token is passed using the standard RFC 6750 bearer scheme
    (`Authorization: Bearer <token>`); the scheme name is matched case-insensitively.
    For backwards compatibility, the legacy, bare form (`Authorization: <token>`) is 
    still accepted, but this usage is deprecated and will be removed in a future
    release.

    There has been significant improvements and feature additions for REST API in each of the
    recent releases.  Hence, it is highly recommended to use latest release when leveraging the
    REST APIs.

    REST API is enabled by default since MantisBT 2.8.0 release.

    ## Getting started

    All paths in this document are relative to the MantisBT installation. For example, an
    installation at `https://mantis.example.com` serves this API at
    `https://mantis.example.com/api/rest`. Use the non-trailing-slash form shown in
    this document. Requests and responses use JSON unless an endpoint explicitly documents a
    different format.

    Create an API token in MantisBT, then send the token value directly in the `Authorization`
    header:

    ```http
    Authorization: Bearer <api-token>
    Content-Type: application/json
    ```

    Browser requests authenticated with a MantisBT session cookie are also supported. When
    anonymous access is enabled, read operations may be available without either credential;
    permissions still apply in every case.

    ## Common request conventions

    Object references generally accept an `id` or `name`, allowing clients to use stable numeric
    identifiers while still supporting readable payloads. List endpoints that expose `page` and
    `page_size` use one-based page numbers. The `select` query parameter accepts a comma-separated
    list of fields, which is useful for reducing response size when only a subset is required.

    File uploads are JSON payloads: each entry in `files` has a filename in `name` and base64-encoded
    data in `content`.

    ## Conditional issue updates

    Issue reads return an `ETag`. Send it in `If-Match` on issue updates or deletes to prevent
    overwriting a newer version; a stale value produces `412 Precondition Failed` and returns the
    current `ETag`. Send the same value in `If-None-Match` on a read to receive `304 Not Modified`
    when the issue has not changed.

    ## Errors and response headers

    Successful responses identify the effective user and authentication method in
    `X-Mantis-Username` and `X-Mantis-LoginMethod`; `X-Mantis-Version` reports the running
    MantisBT version. A `204` response intentionally has no response body. Errors use the HTTP
    status code and may include JSON fields such as `message`, `code`, and `localized`.

    ## Impersonation

    Users with the access level defined by `$g_impersonate_user_threshold` (default: ADMINISTRATOR)
    can execute REST API calls on behalf of another user by adding the `X-Mantis-Username` request
    header containing the target username.  Impersonation requires API token authentication;
    it is not available with cookie or anonymous access.

    Constraints:
    - The caller must authenticate with an API token.
    - The caller must have at least the `$g_impersonate_user_threshold` access level.
    - A user cannot impersonate themselves.
    - A user cannot impersonate a user with a higher access level than their own.
    - The target user must be a valid, enabled user.

    ## Response Headers

    Every API response includes the following informational headers:
    - `X-Mantis-Username` – The username under which the request was executed (the impersonated
      user's name when impersonation is active).
    - `X-Mantis-LoginMethod` – The authentication method used: `api-token`, `cookie`, or `anonymous`.
  license:
    name: GPL-2.0-or-later
    url: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
  contact:
    name: MantisBT Team
    email: mantisbt-dev@lists.sourceforge.net
    url: https://mantisbt.org
paths:
  '/api/rest/filters/{id}':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    get:
      summary: Get a filter
      operationId: FilterGet
      description: ''
      tags:
        - 'Filters'
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
      parameters:
        - $ref: '#/components/parameters/filter_id'
    delete:
      summary: Delete a filter
      operationId: FilterDelete
      description: ''
      tags:
        - 'Filters'
      parameters:
        - $ref: '#/components/parameters/filter_id'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/filters':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    get:
      summary: Get all filters
      operationId: FilterGetAll
      description: ''
      tags:
        - 'Filters'
      parameters:
        - name: project_id
          in: query
          schema:
            type: integer
          description: Return filters available in the specified project.
          required: false
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/config':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    get:
      summary: Get Configuration Option
      operationId: ConfigGet
      description: ''
      tags:
        - 'Configs'
      parameters:
        - name: option[]
          in: query
          schema:
            type: string
          description: ''
          required: true
        - name: project_id
          in: query
          schema:
            type: integer
          description: ''
          required: false
        - name: user_id
          in: query
          schema:
            type: integer
          description: ''
          required: false
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    patch:
      summary: Set Configs
      operationId: ConfigSet
      description: ''
      tags:
        - 'Configs'
      requestBody:
        $ref: '#/components/requestBodies/ConfigSet'
      responses:
        '200':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/users/me':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    get:
      summary: Get My User Info
      operationId: UserGetMe
      description: ''
      tags:
        - 'Users'
      parameters:
        - name: select
          in: query
          schema:
            type: string
          description: Comma-separated list of user fields to return.
          required: false
          example: id,name,real_name,email,access_level
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/issues/{id}/files':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    post:
      summary: Add attachments to issue
      operationId: IssueFilesAdd
      description: ''
      tags:
        - 'Issue Attachments'
      parameters:
        - $ref: '#/components/parameters/issue_id'
      requestBody:
        $ref: '#/components/requestBodies/IssueFilesAdd'
      responses:
        '201':
          $ref: '#/components/responses/CreatedNoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    get:
      summary: Get issue files
      operationId: IssueFilesGet
      description: ''
      tags:
        - 'Issue Attachments'
      parameters:
        - $ref: '#/components/parameters/issue_id'
      responses:
        '200':
          description: Issue files returned successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FileCollection'
          headers:
            X-Mantis-Username:
              $ref: '#/components/headers/X-Mantis-Username'
            X-Mantis-LoginMethod:
              $ref: '#/components/headers/X-Mantis-LoginMethod'
            X-Mantis-Version:
              $ref: '#/components/headers/X-Mantis-Version'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/issues/{id}/notes':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    post:
      summary: Create an issue note
      operationId: IssueNotesAdd
      description: ''
      tags:
        - 'Issue Notes'
      parameters:
        - $ref: '#/components/parameters/issue_id'
      requestBody:
        $ref: '#/components/requestBodies/IssueNotesAdd'
      responses:
        '201':
          $ref: '#/components/responses/Created'
        '202':
          $ref: '#/components/responses/Accepted'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/issues/{id}/notes/{note_id}':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    delete:
      summary: Delete an issue note
      operationId: IssueNotesDelete
      description: ''
      tags:
        - 'Issue Notes'
      parameters:
        - $ref: '#/components/parameters/issue_id'
        - name: note_id
          in: path
          schema:
            type: integer
          description: ''
          required: true
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/issues/{id}/relationships':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    post:
      summary: Add an issue relationship
      operationId: IssueRelationshipsAdd
      description: ''
      tags:
        - 'Issue Relationships'
      parameters:
        - $ref: '#/components/parameters/issue_id'
      requestBody:
        $ref: '#/components/requestBodies/IssueRelationshipsAdd'
      responses:
        '201':
          $ref: '#/components/responses/Created'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/issues/{id}/tags':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    post:
      summary: Attach a tag to issue
      operationId: IssueTagsAdd
      description: ''
      tags:
        - 'Issue Tags'
      parameters:
        - $ref: '#/components/parameters/issue_id'
      requestBody:
        $ref: '#/components/requestBodies/IssueTagsAdd'
      responses:
        '201':
          $ref: '#/components/responses/Created'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/issues/{id}/relationships/{relationship_id}':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    delete:
      summary: Delete an issue relationship
      operationId: IssueRelationshipsDelete
      description: ''
      tags:
        - 'Issue Relationships'
      parameters:
        - $ref: '#/components/parameters/issue_id'
        - name: relationship_id
          in: path
          schema:
            type: integer
          description: ''
          required: true
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/issues/{id}/tags/{tag_id}':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    delete:
      summary: Detach a tag from an issue
      operationId: IssueTagsDelete
      description: ''
      tags:
        - 'Issue Tags'
      parameters:
        - $ref: '#/components/parameters/issue_id'
        - name: tag_id
          in: path
          schema:
            type: integer
          description: ''
          required: true
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/issues':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    get:
      summary: Get issues
      operationId: IssueGetAll
      description: |-
        Returns issues visible to the effective user. Use `project_id` to scope the search and
        `filter_id` for a built-in or saved filter. Results are paginated; omit `select` to use
        the default issue fields. The response includes an `ETag`; send it in `If-None-Match`
        to receive `304 Not Modified` when the result has not changed.
      tags:
        - 'Issues'
      parameters:
        - name: project_id
          in: query
          schema:
            type: integer
            minimum: 0
          description: ''
          required: false
          example: 1
        - $ref: '#/components/parameters/issues_filter_id'
        - name: page_size
          in: query
          schema:
            type: integer
          description: ''
          required: false
        - name: page
          in: query
          schema:
            type: integer
            minimum: 1
          description: ''
          required: false
          example: 1
        - name: select
          in: query
          schema:
            type: string
          description: ''
          required: false
          example: id,summary,description
        - $ref: '#/components/parameters/If-None-Match'
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '304':
          $ref: '#/components/responses/NotModified'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    post:
      summary: Create an issue
      operationId: IssueAdd
      description: |
        When creating an issue, most of the fields other than `summary`, `description` and `category` are typically optional.
        It is also worth noting that when passing references to enumerations like `priority` or object references like `handler`,
        it is sufficient to pass the `id` or `name`.
      tags:
        - 'Issues'
      requestBody:
        $ref: '#/components/requestBodies/IssueAdd'
      responses:
        '201':
          $ref: '#/components/responses/Created'
        '202':
          $ref: '#/components/responses/Accepted'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    delete:
      summary: Delete issues
      operationId: IssueDeleteAll
      description: Deletes the issues selected by the request's issue parameters.
      tags:
        - 'Issues'
      parameters:
        - name: id
          in: query
          schema:
            type: integer
            minimum: 1
          description: ID of the issue to delete.
          required: true
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/issues/{id}':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    get:
      summary: Get an issue
      operationId: IssueGet
      description: |-
        Returns one visible issue. The response includes an `ETag`; use it with `If-Match` when
        subsequently updating or deleting the issue.
      tags:
        - 'Issues'
      parameters:
        - $ref: '#/components/parameters/issue_id'
        - name: select
          in: query
          schema:
            type: string
          description: ''
          required: false
          example: id,summary,description
        - $ref: '#/components/parameters/If-None-Match'
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '304':
          $ref: '#/components/responses/NotModified'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    patch:
      summary: Update an issue
      operationId: IssueUpdate
      description: |-
        Applies the supplied fields to an existing issue. For optimistic concurrency, first read
        the issue and send its `ETag` in `If-Match`. A mismatch returns `412 Precondition Failed`.
      tags:
        - 'Issues'
      parameters:
        - $ref: '#/components/parameters/issue_id'
        - $ref: '#/components/parameters/If-Match'
      requestBody:
        $ref: '#/components/requestBodies/IssueUpdate'
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '412':
          $ref: '#/components/responses/PreconditionFailed'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    delete:
      summary: Delete an issue
      operationId: IssueDelete
      description: |-
        Deletes an issue. Supply the current `ETag` in `If-Match` to ensure that the issue was
        not changed after it was read.
      tags:
        - 'Issues'
      parameters:
        - $ref: '#/components/parameters/issue_id'
        - $ref: '#/components/parameters/If-Match'
      responses:
        '204':
          $ref: '#/components/responses/NoContentWithETag'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '412':
          $ref: '#/components/responses/PreconditionFailed'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/issues/{id}/move':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
      - $ref: '#/components/parameters/issue_id'
    post:
      summary: Move an issue
      operationId: IssueMove
      description: Moves an issue to another project and optionally adds a note.
      tags:
        - 'Issues'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [project]
              properties:
                project:
                  $ref: '#/components/schemas/ObjectRef'
                note:
                  $ref: '#/components/schemas/IssueNotesAdd'
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/issues/{id}/files/{file_id}':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    get:
      summary: Get file from issue
      operationId: IssueFileGet
      description: ''
      tags:
        - 'Issue Attachments'
      parameters:
        - $ref: '#/components/parameters/issue_id'
        - name: file_id
          in: path
          schema:
            type: integer
          description: ''
          required: true
          example: 567
      responses:
        '200':
          description: File returned successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FileCollection'
          headers:
            X-Mantis-Username:
              $ref: '#/components/headers/X-Mantis-Username'
            X-Mantis-LoginMethod:
              $ref: '#/components/headers/X-Mantis-LoginMethod'
            X-Mantis-Version:
              $ref: '#/components/headers/X-Mantis-Version'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    delete:
      summary: Delete an attachment from an issue
      operationId: IssueFileDelete
      description: Deletes an attachment when the authenticated user has permission to do so.
      tags:
        - 'Issue Attachments'
      parameters:
        - $ref: '#/components/parameters/issue_id'
        - name: file_id
          in: path
          schema:
            type: integer
          description: ID of the attachment to delete.
          required: true
          example: 567
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/issues/{id}/monitors':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    post:
      summary: Monitor an issue
      operationId: IssueMonitor
      description: ''
      tags:
        - 'Issue Monitoring'
      parameters:
        - $ref: '#/components/parameters/issue_id'
      requestBody:
        $ref: '#/components/requestBodies/IssueMonitor'
      responses:
        '201':
          $ref: '#/components/responses/Created'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/lang':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    get:
      summary: Get multiple localized strings
      operationId: StringGet
      description: ''
      tags:
        - 'Localized Strings'
      parameters:
        - name: string
          in: query
          schema:
            type: string
          description: ''
          required: true
          example: all_projects
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/pages/issues/view/{id}':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    get:
      summary: Get Issue View Page
      operationId: IssueGetViewPage
      description: ''
      tags:
        - 'Views'
      parameters:
        - $ref: '#/components/parameters/issue_id'
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/users/me/token':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    post:
      summary: Create token for me
      operationId: TokenCreateForMe
      description: |-
        Creates a token for the authenticated user. Store the returned token securely: it is the
        credential sent in the `Authorization` header for subsequent API calls.
      tags:
        - 'API Tokens'
      requestBody:
        $ref: '#/components/requestBodies/TokenCreate'
      responses:
        '201':
          $ref: '#/components/responses/Created'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/users/{user_id}/token':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    post:
      summary: Create token for user
      operationId: TokenCreateForUser
      description: |-
        Creates a token for another user. This requires permission to impersonate that user and
        cannot target a user with a higher access level than the caller.
      tags:
        - 'API Tokens'
      parameters:
        - $ref: '#/components/parameters/user_id'
      requestBody:
        $ref: '#/components/requestBodies/TokenCreate'
      responses:
        '201':
          $ref: '#/components/responses/Created'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/users/me/token/{token_id}':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    delete:
      summary: Delete token for me
      operationId: TokenDeleteForMe
      description: ''
      tags:
        - 'API Tokens'
      parameters:
        - name: token_id
          in: path
          schema:
            type: integer
          description: ''
          required: true
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/users/{user_id}/token/{token_id}':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    delete:
      summary: Delete token for user
      operationId: TokenDeleteForUser
      description: ''
      tags:
        - 'API Tokens'
      parameters:
        - $ref: '#/components/parameters/user_id'
        - name: token_id
          in: path
          schema:
            type: integer
          description: ''
          required: true
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/projects':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    post:
      summary: Create a project
      operationId: ProjectAdd
      description: ''
      tags:
        - 'Projects'
      requestBody:
        $ref: '#/components/requestBodies/ProjectAdd'
      responses:
        '201':
          $ref: '#/components/responses/Created'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    get:
      summary: Get all projects
      operationId: ProjectGetAll
      description: ''
      tags:
        - 'Projects'
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/projects/{id}':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    get:
      summary: Get a project
      operationId: ProjectGet
      description: ''
      tags:
        - 'Projects'
      parameters:
        - $ref: '#/components/parameters/project_id'
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    patch:
      summary: Update a project
      operationId: ProjectUpdate
      description: ''
      tags:
        - 'Projects'
      parameters:
        - $ref: '#/components/parameters/project_id'
      requestBody:
        $ref: '#/components/requestBodies/ProjectUpdate'
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    delete:
      summary: Delete a project
      operationId: ProjectDelete
      description: ''
      tags:
        - 'Projects'
      parameters:
        - $ref: '#/components/parameters/project_id'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/projects/{id}/categories/{category_id}':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
      - $ref: '#/components/parameters/project_id'
      - name: category_id
        in: path
        schema:
          type: integer
          minimum: 1
        required: true
    get:
      summary: Get a project category
      operationId: ProjectCategoriesGet
      tags: ['Project Categories']
      responses:
        '200': { $ref: '#/components/responses/Success' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '404': { $ref: '#/components/responses/NotFound' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '403': { $ref: '#/components/responses/Forbidden' }
    patch:
      summary: Update a project category
      operationId: ProjectCategoriesUpdate
      tags: ['Project Categories']
      requestBody:
        $ref: '#/components/requestBodies/ProjectCategoriesUpdate'
      responses:
        '200': { $ref: '#/components/responses/Success' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '404': { $ref: '#/components/responses/NotFound' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '403': { $ref: '#/components/responses/Forbidden' }
    delete:
      summary: Delete a project category
      operationId: ProjectCategoriesDelete
      tags: ['Project Categories']
      responses:
        '204': { $ref: '#/components/responses/NoContent' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '404': { $ref: '#/components/responses/NotFound' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '403': { $ref: '#/components/responses/Forbidden' }
  '/api/rest/projects/{id}/categories':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
      - $ref: '#/components/parameters/project_id'
    get:
      summary: Get project categories
      operationId: ProjectCategoriesGetAll
      tags: ['Project Categories']
      responses:
        '200': { $ref: '#/components/responses/Success' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '404': { $ref: '#/components/responses/NotFound' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '403': { $ref: '#/components/responses/Forbidden' }
    post:
      summary: Create a project category
      operationId: ProjectCategoriesAdd
      tags: ['Project Categories']
      requestBody:
        $ref: '#/components/requestBodies/ProjectCategoriesAdd'
      responses:
        '201': { $ref: '#/components/responses/Created' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '404': { $ref: '#/components/responses/NotFound' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '403': { $ref: '#/components/responses/Forbidden' }
  '/api/rest/projects/{id}/fields/{field_id}':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    post:
      summary: Link a custom field to a project
      operationId: ProjectFieldLink
      description: Links the custom field to the project. The optional sequence controls its order.
      tags:
        - 'Projects'
      parameters:
        - $ref: '#/components/parameters/project_id'
        - name: field_id
          in: path
          schema:
            type: integer
          required: true
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                sequence:
                  type: integer
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    delete:
      summary: Unlink a custom field from a project
      operationId: ProjectFieldUnlink
      description: Removes the custom field link from the project without deleting its values.
      tags:
        - 'Projects'
      parameters:
        - $ref: '#/components/parameters/project_id'
        - name: field_id
          in: path
          schema:
            type: integer
          required: true
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/projects/{id}/versions/{version_id}':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    delete:
      summary: Delete a project version
      operationId: ProjectVersionsDelete
      description: ''
      tags:
        - 'Project Versions'
      parameters:
        - $ref: '#/components/parameters/project_id'
        - name: version_id
          in: path
          schema:
            type: integer
          description: ''
          required: true
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    get:
      summary: Get a Project Version
      operationId: ProjectVersionsGet
      description: ''
      tags:
        - 'Project Versions'
      parameters:
        - $ref: '#/components/parameters/project_id'
        - name: version_id
          in: path
          schema:
            type: integer
          description: ''
          required: true
          example: 18
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    patch:
      summary: Update project version
      operationId: ProjectVersionsUpdate
      description: ''
      tags:
        - 'Project Versions'
      parameters:
        - $ref: '#/components/parameters/project_id'
        - name: version_id
          in: path
          schema:
            type: integer
          description: ''
          required: true
          example: 8
      requestBody:
        $ref: '#/components/requestBodies/ProjectVersionsUpdate'
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/projects/{id}/versions':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    get:
      summary: Get Project Versions
      operationId: ProjectVersionsGetAll
      description: ''
      tags:
        - 'Project Versions'
      parameters:
        - $ref: '#/components/parameters/project_id'
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    post:
      summary: Create a project version
      operationId: ProjectVersionsAdd
      description: ''
      tags:
        - 'Project Versions'
      parameters:
        - $ref: '#/components/parameters/project_id'
      requestBody:
        $ref: '#/components/requestBodies/ProjectVersionsAdd'
      responses:
        '201':
          $ref: '#/components/responses/Created'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/projects/{id}/subprojects':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    post:
      summary: Add a sub-project
      operationId: ProjectSubprojectsAdd
      description: ''
      tags:
        - 'Projects'
      parameters:
        - $ref: '#/components/parameters/project_id'
      requestBody:
        $ref: '#/components/requestBodies/ProjectSubprojectsAdd'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/projects/{id}/subprojects/{subproject_id}':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    patch:
      summary: Update a subproject
      operationId: ProjectSubprojectsUpdate
      description: ''
      tags:
        - 'Projects'
      parameters:
        - $ref: '#/components/parameters/project_id'
        - name: subproject_id
          in: path
          schema:
            type: integer
          description: ''
          required: true
          example: 2
      requestBody:
        $ref: '#/components/requestBodies/ProjectSubprojectsUpdate'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    delete:
      summary: Delete a subproject relationship
      operationId: ProjectSubprojectsDelete
      description: ''
      tags:
        - 'Projects'
      parameters:
        - $ref: '#/components/parameters/project_id'
        - name: subproject_id
          in: path
          schema:
            type: integer
          description: ''
          required: true
          example: 2
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/projects/{id}/handlers':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    get:
      summary: Get Project Users that can be assigned issues
      operationId: ProjectUsersCanHandleIssues
      description: ''
      tags:
        - 'Project Users'
      parameters:
        - $ref: '#/components/parameters/project_id'
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/projects/{id}/users':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    get:
      summary: Get Project Users
      operationId: ProjectUsersGetAll
      description: ''
      tags:
        - 'Project Users'
      parameters:
        - $ref: '#/components/parameters/project_id'
        - name: access_level
          in: query
          schema:
            type: integer
            minimum: 1
            maximum: 100
          description: ''
          required: false
          example: 25
        - name: include_access_levels
          in: query
          schema:
            type: integer
            minimum: 0
            maximum: 1
          description: ''
          required: false
          example: 0
        - name: page_size
          in: query
          schema:
            type: integer
          description: ''
          required: false
        - name: page
          in: query
          schema:
            type: integer
            minimum: 1
          description: ''
          required: false
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    put:
      summary: Project Add-Update User
      operationId: ProjectUsersUpsert
      description: ''
      tags:
        - 'Project Users'
      parameters:
        - $ref: '#/components/parameters/project_id'
      requestBody:
        $ref: '#/components/requestBodies/ProjectUsersUpsert'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    post:
      summary: Add or update a project user
      operationId: ProjectUsersAdd
      description: ''
      tags:
        - 'Project Users'
      parameters:
        - $ref: '#/components/parameters/project_id'
      requestBody:
        $ref: '#/components/requestBodies/ProjectUsersUpsert'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/projects/{id}/users/{user_id}':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    delete:
      summary: Project Delete User
      operationId: ProjectUsersDelete
      description: ''
      tags:
        - 'Project Users'
      parameters:
        - $ref: '#/components/parameters/project_id'
        - $ref: '#/components/parameters/user_id'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/users':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    get:
      summary: Get users
      operationId: UserGetAll
      description: Returns users visible to the effective user.
      tags:
        - 'Users'
      parameters:
        - name: select
          in: query
          schema:
            type: string
          description: Comma-separated list of user fields to return.
          required: false
          example: id,name,real_name,email,access_level
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    post:
      summary: Create a user
      operationId: UserAdd
      description: ''
      tags:
        - 'Users'
      requestBody:
        $ref: '#/components/requestBodies/UserAdd'
      responses:
        '201':
          $ref: '#/components/responses/Created'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/users/{user_id}':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    get:
      summary: Get User By Id
      operationId: UserGet
      description: ''
      tags:
        - 'Users'
      parameters:
        - $ref: '#/components/parameters/user_id'
        - name: select
          in: query
          schema:
            type: string
          description: ''
          required: false
          example: id,name,real_name,email,access_level
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    patch:
      summary: Update User
      operationId: UserUpdate
      description: ''
      tags:
        - 'Users'
      parameters:
        - $ref: '#/components/parameters/user_id'
      requestBody:
        $ref: '#/components/requestBodies/UserUpdate'
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
    delete:
      summary: Delete a user
      operationId: UserDelete
      description: ''
      tags:
        - 'Users'
      parameters:
        - $ref: '#/components/parameters/user_id'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/users/username/{username}':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    get:
      summary: Get User By Username
      operationId: UserGetByUsername
      description: ''
      tags:
        - 'Users'
      parameters:
        - name: username
          in: path
          schema:
            type: string
          description: ''
          required: true
        - name: select
          in: query
          schema:
            type: string
          description: ''
          required: false
          example: id,name,real_name,email
      responses:
        '200':
          $ref: '#/components/responses/Success'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
  '/api/rest/users/{id}/reset':
    parameters:
      - $ref: '#/components/parameters/X-Mantis-Username'
    put:
      summary: Reset user password
      operationId: UserResetPassword
      description: ''
      tags:
        - 'Users'
      parameters:
        - name: id
          in: path
          schema:
            type: integer
            minimum: 1
          description: The user ID.
          required: true
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
servers:
  - url: https://mantisbt.org/bugs
    description: MantisBT Official Bugtracker
  - url: '{protocol}://{hostname}:{port}/{basePath}'
    description: Your MantisBT instance
    variables:
      protocol:
        enum:
          - http
          - https
        default: https
      hostname:
        description: The server where MantisBT is installed, including port number if not standard.
        default: localhost
      port:
        default: ''
      basePath:
        description: The path where MantisBT is installed, without trailing `/`
        default: mantisbt
security:
  - api_key: []
components:
  securitySchemes:
    api_key:
      type: http
      scheme: bearer
      description: |-
        The user's API token, sent with the RFC 6750 bearer scheme (`Bearer <token>`).
        
        The legacy bare form (`<token>`) is still accepted for backwards compatibility,
        but this usage is deprecated and will be removed in a future release.
  headers:
    ETag:
      description: Entity tag for the response representation, when conditional requests are supported.
      schema:
        type: string
    WWW-Authenticate:
      description: Authentication challenge indicating that a bearer API token is accepted.
      schema:
        type: string
        example: Bearer
    X-Mantis-Username:
      description: |-
        The username under which the request was executed.
        When impersonation is active, this reflects the impersonated user's username.
      schema:
        type: string
    X-Mantis-LoginMethod:
      description: |-
        The authentication method used for the request.
        Possible values: `api-token`, `cookie`, `anonymous`.
      schema:
        type: string
        enum:
          - api-token
          - cookie
          - anonymous
    X-Mantis-Version:
      description: Version of the MantisBT instance that processed the request.
      schema:
        type: string
  schemas:
    ObjectRef:
      type: object
      properties:
        id:
          type: integer
          example: 1
        name:
          type: string
          example: Some Name
    ProjectRef:
      allOf:
        - $ref: '#/components/schemas/ObjectRef'
      properties:
        name:
          type: string
          example: MantisBT
    CategoryRef:
      allOf:
        - $ref: '#/components/schemas/ObjectRef'
      properties:
        name:
          type: string
          example: Authn
    UserRef:
      allOf:
        - $ref: '#/components/schemas/ObjectRef'
      properties:
        name:
          type: string
          example: John Doe
        email:
          type: string
          example: john@example.com
    Enum:
      type: object
      properties:
        id:
          type: number
        name:
          type: string
          example: some-name
        label:
          type: string
          example: Localized Name
    ViewStateEnum:
      allOf:
        - $ref: '#/components/schemas/Enum'
      properties:
        id:
          type: number
          example: 10
        name:
          type: string
          example: public
        label:
          type: string
          example: Public
    PriorityEnum:
      allOf:
        - $ref: '#/components/schemas/Enum'
      properties:
        id:
          type: number
          example: 40
        name:
          type: string
          example: high
        label:
          type: string
          example: High
    SeverityEnum:
      allOf:
        - $ref: '#/components/schemas/Enum'
      properties:
        id:
          type: number
          example: 60
        name:
          type: string
          example: major
        label:
          type: string
          example: Major
    ReproducibilityEnum:
      allOf:
        - $ref: '#/components/schemas/Enum'
      properties:
        id:
          type: number
          example: 10
        name:
          type: string
          example: always
        label:
          type: string
          example: Always
    AccessLevel:
      allOf:
        - $ref: '#/components/schemas/Enum'  
    User:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        real_name:
          type: string
        email:
          type: string
        access_level:
          $ref: '#/components/schemas/AccessLevel'
        enabled:
          type: boolean
        protected:
          type: boolean
        language:
          type: string
        timezone:
          type: string
        created_at:
          type: string
          format: date-time
    UserWithPassword:
      allOf:
        - $ref: '#/components/schemas/User'
      type: object
      properties:
        password:
          type: string
    Issue:
      type: object
      properties:
        id:
          type: integer
        summary:
          type: string
          example: 'This is a summary'
        description:
          type: string
          example: |
            This is a description.  
            It can be multiline.
        steps_to_reproduce:
          type: string
          example: |
            This is steps to reproduce.  
            It can be multiline.
        additional_information:
          type: string
          example: |
            This is additional information.  
            It can be multiline.
        project:
          $ref: '#/components/schemas/ProjectRef'
        category:
          $ref: '#/components/schemas/CategoryRef'
        handler:
          $ref: '#/components/schemas/UserRef'
        reporter:
          $ref: '#/components/schemas/UserRef'
        status:
          $ref: '#/components/schemas/Enum'
        resolution:
          $ref: '#/components/schemas/Enum'
        projection:
          $ref: '#/components/schemas/Enum'
        eta:
          $ref: '#/components/schemas/Enum'
        view_state:
          $ref: '#/components/schemas/ViewStateEnum'
        priority:
          $ref: '#/components/schemas/PriorityEnum'
        severity:
          $ref: '#/components/schemas/SeverityEnum'
        reproducibility:
          $ref: '#/components/schemas/ReproducibilityEnum'
        version:
          $ref: '#/components/schemas/ProjectRef'
        fixed_in_version:
          $ref: '#/components/schemas/ProjectRef'
        target_version:
          $ref: '#/components/schemas/ProjectRef'
        sticky:
          type: boolean
          description: |
            sticky issues show at the top of the View Issues page.
        due_date:
          type: string
          format: date
        date_submitted:
          type: string
          format: date-time
        date_updated:
          type: string
          format: date-time
        os:
          type: string
        os_build:
          type: string
        build:
          type: string
        platform:
          type: string
        profile_id:
          type: integer
        profile:
          type: object
          additionalProperties: true
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        attachments:
          type: array
          items:
            $ref: '#/components/schemas/File'
        relationships:
          type: array
          items:
            type: object
            additionalProperties: true
        tags:
          type: array
          items:
            type: object
            additionalProperties: true
        history:
          type: array
          items:
            type: object
            additionalProperties: true
        notes:
          type: array
          items:
            $ref: '#/components/schemas/IssueNote'
        monitors:
          type: array
          items:
            $ref: '#/components/schemas/UserRef'
        files:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              content:
                type: string
        custom_fields:
          type: array
          items:
            type: object
            properties:
              field:
                type: object
                properties:
                  id:
                    type: number
                  name:
                    type: string
              value:
                type: string
    IssueNote:
      type: object
      properties:
        id:
          type: integer
        text:
          type: string
        reporter:
          $ref: '#/components/schemas/UserRef'
        view_state:
          $ref: '#/components/schemas/ViewStateEnum'
        type:
          type: string
        attr:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        attachments:
          type: array
          items:
            $ref: '#/components/schemas/File'
        time_tracking:
          type: object
          properties:
            duration:
              type: string
        files:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              content:
                type: string
    IssueNotesAdd:
      type: object
      properties:
        text:
          type: string
        view_state:
          $ref: '#/components/schemas/ViewStateEnum'
        time_tracking:
          type: object
          properties:
            duration:
              type: string
        files:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              content:
                type: string
      description: Fields accepted when creating an issue note, including attachments and time tracking.
    IssueCollection:
      type: object
      required: [issues]
      properties:
        issues:
          type: array
          items:
            $ref: '#/components/schemas/Issue'
    IssueResponse:
      type: object
      required: [issue]
      properties:
        issue:
          $ref: '#/components/schemas/Issue'
    IssueNoteCollection:
      type: object
      required: [notes]
      properties:
        notes:
          type: array
          items:
            $ref: '#/components/schemas/IssueNote'
    IssueNoteResponse:
      type: object
      properties:
        note:
          $ref: '#/components/schemas/IssueNote'
        issue:
          $ref: '#/components/schemas/Issue'
    File:
      type: object
      properties:
        id:
          type: integer
        reporter:
          $ref: '#/components/schemas/UserRef'
        created_at:
          type: string
          format: date-time
        filename:
          type: string
        size:
          type: integer
        content_type:
          type: string
        content:
          type: string
          description: Base64-encoded file content.
          format: byte
    FileCollection:
      type: object
      required: [files]
      properties:
        files:
          type: array
          items:
            $ref: '#/components/schemas/File'
    UserCollection:
      type: object
      required: [users]
      properties:
        users:
          type: array
          items:
            $ref: '#/components/schemas/User'
    UserResponse:
      type: object
      required: [user]
      properties:
        user:
          $ref: '#/components/schemas/User'
    Project:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        status:
          $ref: '#/components/schemas/Enum'
        description:
          type: string
        enabled:
          type: boolean
        view_state:
          $ref: '#/components/schemas/ViewStateEnum'
        inherit_global:
          type: boolean
        access_level:
          $ref: '#/components/schemas/AccessLevel'
        custom_fields:
          type: array
          items:
            type: object
            additionalProperties: true
        versions:
          type: array
          items:
            type: object
            additionalProperties: true
        categories:
          type: array
          items:
            type: string
      additionalProperties: true
    ProjectCollection:
      type: object
      required: [projects]
      properties:
        projects:
          type: array
          items:
            $ref: '#/components/schemas/Project'
    ProjectCategory:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        project:
          $ref: '#/components/schemas/ProjectRef'
        handler:
          $ref: '#/components/schemas/UserRef'
        enabled:
          type: boolean
    ProjectCategoryCollection:
      type: object
      required: [categories]
      properties:
        categories:
          type: array
          items:
            $ref: '#/components/schemas/ProjectCategory'
    ProjectCategoryResponse:
      type: object
      required: [category]
      properties:
        category:
          $ref: '#/components/schemas/ProjectCategory'
    ProjectResponse:
      type: object
      required: [project]
      properties:
        project:
          $ref: '#/components/schemas/Project'
    VersionResponse:
      type: object
      properties:
        version:
          type: object
          additionalProperties: true
    TokenResponse:
      type: object
      properties:
        token:
          type: string
        name:
          type: string
      additionalProperties: true
    GenericResponse:
      type: object
      additionalProperties: true
    ConfigResponse:
      type: object
      required: [configs]
      properties:
        configs:
          type: array
          items:
            type: object
            required: [option, value]
            properties:
              option:
                type: string
              value: {}
    LocalizedStringsResponse:
      type: object
      required: [strings, language]
      properties:
        strings:
          type: array
          items:
            type: object
            required: [name, localized]
            properties:
              name:
                type: string
              localized:
                type: string
        language:
          type: string
    ConfigSet:
      type: object
      properties:
        project:
          type: object
          properties:
            name:
              type: string
        configs:
          type: array
          items:
            type: object
            properties:
              option:
                type: string
              value:
                type: string
    IssueFilesAdd:
      type: object
      properties:
        files:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              content:
                type: string
        reporter:
          type: object
          properties:
            name:
              type: string
    IssueRelationshipsAdd:
      type: object
      properties:
        issue:
          type: object
          properties:
            id:
              type: number
        type:
          type: object
          properties:
            name:
              type: string
    IssueTagsAdd:
      type: object
      properties:
        tags:
          type: array
          items:
            type: object
            properties:
              id:
                type: number
    IssueAdd:
      $ref: '#/components/schemas/Issue'
    IssueUpdate:
      type: object
      properties:
        id:
          type: integer
        project:
          $ref: '#/components/schemas/ProjectRef'
        reporter:
          $ref: '#/components/schemas/UserRef'
        summary:
          type: string
        description:
          type: string
        steps_to_reproduce:
          type: string
        additional_information:
          type: string
        category:
          $ref: '#/components/schemas/CategoryRef'
        priority:
          type: object
          properties:
            name:
              type: string
        handler:
          type: object
          properties:
            name:
              type: string
        status:
          type: object
          properties:
            name:
              type: string
        severity:
          type: object
          properties:
            id:
              type: integer
            name:
              type: string
        reproducibility:
          type: object
          properties:
            id:
              type: integer
            name:
              type: string
        resolution:
          type: object
          properties:
            id:
              type: integer
            name:
              type: string
        projection:
          type: object
          properties:
            id:
              type: integer
            name:
              type: string
        eta:
          type: object
          properties:
            id:
              type: integer
            name:
              type: string
        view_state:
          type: object
          properties:
            id:
              type: integer
            name:
              type: string
        version:
          type: object
          properties:
            id:
              type: integer
            name:
              type: string
        fixed_in_version:
          type: object
          properties:
            id:
              type: integer
            name:
              type: string
        target_version:
          type: object
          properties:
            id:
              type: integer
            name:
              type: string
        sticky:
          type: boolean
        due_date:
          type: string
          format: date
        date_submitted:
          type: string
          format: date-time
        date_updated:
          type: string
          format: date-time
        profile_id:
          type: integer
        os:
          type: string
        os_build:
          type: string
        build:
          type: string
        platform:
          type: string
        monitors:
          type: array
          items:
            $ref: '#/components/schemas/UserRef'
        custom_fields:
          type: array
          items:
            type: object
            properties:
              field:
                type: object
                properties:
                  name:
                    type: string
              value:
                type: string
        notes:
          type: array
          items:
            type: object
            properties:
              id:
                type: number
              reporter:
                type: object
                properties:
                  name:
                    type: string
              text:
                type: string
              view_state:
                type: object
                properties:
                  id:
                    type: number
                  name:
                    type: string
                  label:
                    type: string
    ProjectAdd:
      type: object
      properties:
        name:
          type: string
        status:
          type: object
          properties:
            name:
              type: string
        description:
          type: string
        file_path:
          type: string
        view_state:
          type: object
          properties:
            name:
              type: string
        enabled:
          type: boolean
    ProjectUpdate:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        description:
          type: string
        status:
          type: object
          properties:
            id:
              type: integer
            name:
              type: string
        view_state:
          type: object
          properties:
            id:
              type: integer
            name:
              type: string
        enabled:
          type: boolean
        inherit_global:
          type: integer
        file_path:
          type: string
    ProjectVersionsAdd:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        released:
          type: boolean
        obsolete:
          type: boolean
        timestamp:
          type: string
    ProjectVersionsUpdate:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        released:
          type: boolean
        obsolete:
          type: boolean
        timestamp:
          type: string
          format: date-time
    ProjectCategoriesAdd:
      type: object
      required: [name]
      properties:
        name:
          type: string
        handler:
          $ref: '#/components/schemas/UserRef'
        enabled:
          type: boolean
    ProjectCategoriesUpdate:
      type: object
      properties:
        name:
          type: string
        handler:
          $ref: '#/components/schemas/UserRef'
        enabled:
          type: boolean
    ProjectSubprojectsAdd:
      type: object
      properties:
        project:
          type: object
          properties:
            name:
              type: string
        inherit_parent:
          type: boolean
    ProjectSubprojectsUpdate:
      type: object
      properties:
        project:
          type: object
          properties:
            name:
              type: string
        inherit_parent:
          type: boolean
    ProjectUsersUpsert:
      type: object
      properties:
        user:
          type: object
          properties:
            name:
              type: string
        access_level:
          type: object
          properties:
            name:
              type: string
  requestBodies:
    ConfigSet:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ConfigSet'
      description: ''
      required: true
    IssueFilesAdd:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/IssueFilesAdd'
      description: ''
      required: true
    IssueMonitor:
      content:
        application/json:
          schema:
            type: object
            properties:
              users:
                type: array
                items:
                  $ref: '#/components/schemas/UserRef'
      description: Users to add as monitors. Omit the body to monitor the authenticated user.
      required: false
    TokenCreate:
      content:
        application/json:
          schema:
            type: object
            properties:
              name:
                type: string
      description: Optional token name. The server generates a unique name when omitted.
      required: false
    IssueNotesAdd:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/IssueNotesAdd'
      description: ''
      required: true
    IssueRelationshipsAdd:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/IssueRelationshipsAdd'
      description: ''
      required: true
    IssueTagsAdd:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/IssueTagsAdd'
      description: ''
      required: true
    IssueAdd:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/IssueAdd'
      description: ''
      required: true
    IssueUpdate:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/IssueUpdate'
      description: ''
      required: true
    ProjectAdd:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ProjectAdd'
      description: ''
      required: true
    ProjectUpdate:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ProjectUpdate'
      description: ''
      required: true
    ProjectVersionsAdd:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ProjectVersionsAdd'
      description: ''
      required: true
    ProjectVersionsUpdate:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ProjectVersionsUpdate'
      description: ''
      required: true
    ProjectCategoriesAdd:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ProjectCategoriesAdd'
      required: true
    ProjectCategoriesUpdate:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ProjectCategoriesUpdate'
      required: true
    ProjectSubprojectsAdd:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ProjectSubprojectsAdd'
      description: ''
      required: true
    ProjectSubprojectsUpdate:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ProjectSubprojectsUpdate'
      description: ''
      required: true
    ProjectUsersUpsert:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ProjectUsersUpsert'
      description: ''
      required: true
    UserAdd:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/UserWithPassword'
      description: ''
      required: true
    UserUpdate:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/User'
      description: ''
      required: true
  parameters:
    If-Match:
      name: If-Match
      in: header
      required: false
      schema:
        type: string
      description: ETag returned by a prior issue read. The operation fails with 412 if it no longer matches.
    If-None-Match:
      name: If-None-Match
      in: header
      required: false
      schema:
        type: string
      description: ETag returned by a prior issue read. A matching value returns 304 without a response body.
    X-Mantis-Username:
      name: X-Mantis-Username
      in: header
      required: false
      schema:
        type: string
      description: Username to impersonate for this request. Requires an authorized API token.
    issue_id:
      name: id
      in: path
      schema:
        type: integer
        minimum: 1
      description: 'The issue ID'
      required: true
      example: 123
    user_id:
      name: user_id
      in: path
      schema:
        type: integer
        minimum: 1
      description: 'The user ID'
      example: 5
      required: true
    project_id:
      name: id
      in: path
      schema:
        type: integer
        minimum: 0
      description: 'The project ID'
      required: true
      example: 1
    filter_id:
      name: id
      in: path
      schema:
        type: string
        description: |
          Following are the built-in filter names:  

          `assigned` - issues assigned to me.  
          `reported` - issues reported by me.  
          `monitored` - issues monitored by me.  
          `unassigned` - unassigned issues.  

          It is possible to also pass in an integer
          which is the id of a saved filter.
      required: true
    issues_filter_id:
      name: filter_id
      in: query
      schema:
        type: string
        description: |
          A built-in filter name or the ID of a saved filter.
      required: false
  responses:
    Accepted:
      description: 'Request accepted for moderation'
      headers:
        X-Mantis-Username:
          $ref: '#/components/headers/X-Mantis-Username'
        X-Mantis-LoginMethod:
          $ref: '#/components/headers/X-Mantis-LoginMethod'
        X-Mantis-Version:
          $ref: '#/components/headers/X-Mantis-Version'
    Unauthorized:
      description: Authentication is required or the supplied API token is invalid.
      headers:
        WWW-Authenticate:
          $ref: '#/components/headers/WWW-Authenticate'
    Forbidden:
      description: The authenticated user is not authorized for this operation, impersonation, or API access level.
    ServiceUnavailable:
      description: MantisBT is in offline mode and cannot process API requests.
    Created:
      description: 'Resource created successfully'
      content:
        application/json:
          schema:
            oneOf:
              - $ref: '#/components/schemas/IssueResponse'
              - $ref: '#/components/schemas/IssueCollection'
              - $ref: '#/components/schemas/IssueNoteResponse'
              - $ref: '#/components/schemas/UserResponse'
              - $ref: '#/components/schemas/ProjectResponse'
              - $ref: '#/components/schemas/ProjectCategoryResponse'
              - $ref: '#/components/schemas/ProjectCategoryCollection'
              - $ref: '#/components/schemas/VersionResponse'
              - $ref: '#/components/schemas/TokenResponse'
              - $ref: '#/components/schemas/ConfigResponse'
              - $ref: '#/components/schemas/LocalizedStringsResponse'
              - $ref: '#/components/schemas/GenericResponse'
      headers:
        X-Mantis-Username:
          $ref: '#/components/headers/X-Mantis-Username'
        X-Mantis-LoginMethod:
          $ref: '#/components/headers/X-Mantis-LoginMethod'
        X-Mantis-Version:
          $ref: '#/components/headers/X-Mantis-Version'
    CreatedNoContent:
      description: 'Resource created successfully with no response body'
      headers:
        X-Mantis-Username:
          $ref: '#/components/headers/X-Mantis-Username'
        X-Mantis-LoginMethod:
          $ref: '#/components/headers/X-Mantis-LoginMethod'
        X-Mantis-Version:
          $ref: '#/components/headers/X-Mantis-Version'
    BadRequest:
      description: 'Bad Request'
    NotFound:
      description: 'Entity not found'
    NoContent:
      description: 'Operation completed successfully with no response body'
      headers:
        X-Mantis-Username:
          $ref: '#/components/headers/X-Mantis-Username'
        X-Mantis-LoginMethod:
          $ref: '#/components/headers/X-Mantis-LoginMethod'
        X-Mantis-Version:
          $ref: '#/components/headers/X-Mantis-Version'
    NotModified:
      description: 'The requested issue has not changed since the supplied ETag.'
      headers:
        ETag:
          description: Current entity tag for the requested issue.
          schema:
            type: string
    PreconditionFailed:
      description: 'The supplied If-Match value does not match the current issue ETag.'
      headers:
        ETag:
          description: Current entity tag for the requested issue.
          schema:
            type: string
    Success:
      description: 'Success'
      content:
        application/json:
          schema:
            oneOf:
              - $ref: '#/components/schemas/IssueCollection'
              - $ref: '#/components/schemas/IssueResponse'
              - $ref: '#/components/schemas/IssueNoteCollection'
              - $ref: '#/components/schemas/IssueNoteResponse'
              - $ref: '#/components/schemas/FileCollection'
              - $ref: '#/components/schemas/UserCollection'
              - $ref: '#/components/schemas/UserResponse'
              - $ref: '#/components/schemas/ProjectCollection'
              - $ref: '#/components/schemas/ProjectResponse'
              - $ref: '#/components/schemas/ProjectCategoryResponse'
              - $ref: '#/components/schemas/ProjectCategoryCollection'
              - $ref: '#/components/schemas/VersionResponse'
              - $ref: '#/components/schemas/TokenResponse'
              - $ref: '#/components/schemas/ConfigResponse'
              - $ref: '#/components/schemas/LocalizedStringsResponse'
              - $ref: '#/components/schemas/GenericResponse'
      headers:
        ETag:
          $ref: '#/components/headers/ETag'
        X-Mantis-Username:
          $ref: '#/components/headers/X-Mantis-Username'
        X-Mantis-LoginMethod:
          $ref: '#/components/headers/X-Mantis-LoginMethod'
        X-Mantis-Version:
          $ref: '#/components/headers/X-Mantis-Version'
    NoContentWithETag:
      description: 'Operation completed successfully with no response body'
      headers:
        ETag:
          $ref: '#/components/headers/ETag'
        X-Mantis-Username:
          $ref: '#/components/headers/X-Mantis-Username'
        X-Mantis-LoginMethod:
          $ref: '#/components/headers/X-Mantis-LoginMethod'
        X-Mantis-Version:
          $ref: '#/components/headers/X-Mantis-Version'